Problème dans mon jeu

Pulsar360 Messages postés 113 Date d'inscription   Statut Membre Dernière intervention   -  
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

Voilas, je code un jeu pour m'entraîner, c'est une sorte de space invaders mais le souci c'est que je n'arrive pas à faire apparaître progressivement dans le temps de plus en plus de petit monstre (représenter pour l'instant par un rond qui tourne), il n'y en a qu'un seul, et le deuxième souci c'est que je n'arrive pas non plus à tire plein de balle, il n'y en à qu'une et en plus je ne peux pas décider à quel moment je tire.

Si une personne pouvais m'aider svp.

J'ai mis TOUS mon code ici:
http://ww11.packupload.com/880RW25186F

Il est long pour le copier en entier sur le forum donc je vous laisse le charger chez vous.
J'utilise Eclipse.

Et pour tirer j'aimerais que ça se face avec la touche c du clavier.

unepulsation.free.fr
A voir également:

8 réponses

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Le fichier à télécharger est vide !
0
Pulsar360 Messages postés 113 Date d'inscription   Statut Membre Dernière intervention   10
 
Désolé le site d'hébergement doit avoir un soucis, je les re-up :
http://paf.im/kpqqO
0
Pulsar360 Messages postés 113 Date d'inscription   Statut Membre Dernière intervention   10
 
C'est réparer.
0
Pulsar360 Messages postés 113 Date d'inscription   Statut Membre Dernière intervention   10
 
Tu a pu voir KX?
En faite vue que je n'arriver pas à gérer les événements j'ai simplement créer les objets Tire et Anim pour les intégrer, ce qu'il me faut c'est pouvoir tirer (seulement tirer et pas interagir avec Anim) en appuyant sur c. Et pouvoir faire apparaître de plus en plus d'Anim au fil du temps, je penser faire une boucle pour que tous les 10 sec une nouvelle Anim est créer comme ca au bout de 60 seconde il y en aurait 6 à l'écran mais je n'y arrive pas.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Je viens de récupérer le fichier, je vais regarder tranquillement et je reviens vers toi.
0
Pulsar360 Messages postés 113 Date d'inscription   Statut Membre Dernière intervention   10
 
Ça marche KX, merci pour ton aide très précieuse !
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Bon, déjà une remarque globale : heureusement que j'ai déjà vu quelques morceaux de ton code au travers de quelques discussions, parce que sans explication, ni documentation interne c'est difficile de s'y retrouver, d'autant que ton code n'est pas très conventionnel, mais ça je vais y revenir...

Premier test : je lance l'application, j'ai donc une jolie image "Push J" mais là, premier hic, je m'aperçois que le programme rame, alors qu'il ne devrait pas puisqu'il n'y a rien à faire si ce n'est attendre...

Alors je commence à regarder ton code, et là je tombe sur une première horreur, c'est ton Timer ! De toute évidence tu as mal compris comment te servir des Listener parce que ton timer fais de l'attente active (il boucle) toutes les 20 ms pour faire ton task, qui réaffiche sans cesse ton interface (il appelle toujours start()), mais ce n'est pas du tout comme cela qu'il faudrait faire !

Je comprends du coup un peu mieux quel genre de difficulté tu as pu rencontrer pour gérer l'appui sur une touche (tirer une balle, etc.)
Là il faudrait presque tout revoir tes gestions d'évènements...

Le principe de base de Awt/Swing c'est que ce n'est pas à toi de gérer le Timer. Il y en a déjà qui sont gérés par Java. Ce que tu dois faire c'est ajouter des Listener à tes composants graphiques. Lorsque tu appuies sur une touche ça envoie un message à Java qui le récupères et le traites en l'envoyant aux différents Listener concernés. Mais ça veut dire que si tu ne fais rien au départ, ton programme ne devrait rien faire d'autre qu'attendre, et donc ça ne devrait pas ramer.

Ensuite, il y a de gros problème sur la manière de faire tes interfaces graphiques, ta JFrame en particulier. Il faudrait plutôt que Panneau hérite de JFrame.
Et dans tes JPanel tu recharge sans arrêt l'image dans paintComponent, tu lis donc autant de fois le fichier que tu as d'affichage (donc beaucoup) alors qu'il suffirait de lire une fois l'image au début du programme !

Remarque : vu que tes différents Panel (Start, Pause...) sont fait sur le même principe, tu aurais intérêt à mutualiser les moyens à l'aide d'héritage. Je vais appeller ça "Ecran" qui va gérer l'affichage des images de fond et les Listener.

Alors j'ai pas mal modifié ton code (ça t'évitera d'avoir à le faire toi même). Le but principal de ces modifications est de supprimer Timer et Key pour les remplacer par une utilisation des KeyListener.

Alors tu vas me dire que ton jeu ne marche plus, mais c'est parce que j'ai mis tes Thread A,B,V en commentaire dans la méthode jeu(), puisqu'ils se basaient sur la valeur Key. Donc je savais pas quoi mettre, tu modifieras ce qu'il faut au bon endroit, en particulier sur le keyPressed de Table.

Remarque : cette méthode devrait te permettre de régler le premier problème, tirer au bon moment. Une fois que tu auras tout bien remis en place on pourra reparler de la multiplication des ennemis.

Le code modifié est ici : https://www.petit-fichier.fr/2013/05/14/pack001/
0
Pulsar360 Messages postés 113 Date d'inscription   Statut Membre Dernière intervention   10
 
Salut,
Donc j'ai bien lu ton message et charger ton code, première chose, je pleure...

Non sérieusement, en réalité mon code et un bidouillage alors, tu me dit que j'ai contourner l'utilisation réelle de classe à mon avantage, c'est possible donc je te croit.

J'ai rajouter dans Table ce qu'il fallait, mais du coup je ne peut plus utiliser les touches de déplacement ET tirer en même temps car j'ai mis un println aux keypressed et une seul action et effectuer à la fois, c'est pas ce qu'il faudrait c'est d'ailleurs pour cela que j'ai utiliser des threads.

De même pour l'Anim qui devrait continuellement bouger de haut en bas, c'est pour cela que j'avais créer une boucle pour pouvoir fait posYHRG++, mais la si je m'appuie sur aucune touche le code reste en attente et plus rien de bouge.

Je vais peut être trop vite non? Il me manque encore beaucoup d'acquis.
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
On avait déjà parlé de cette histoire de touches à appuyer en même temps avec walidowich_85, c'était ici : Java keyListener multi touche.
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Remarque : s'il y a vraiment un problème avec les KeyListener on pourrait effectivement envisager d'utiliser un Thread, mais uniquement dans la classe Table (car pour le Start et la Pause, le KeyListener suffit), et seulement quand l'ensemble de touche n'est pas vide (cf. la discussion avec walidowich_85), c'est à dire uniquement quand l'utilisateur appuie sur une touche, le thread serait automatiquement arrêté une fois la dernière touche relevée et redémarrer à l'appui d'une touche. Remarque : on pourrait même être encore plus restrictif en n'ajoutant à l'ensemble de touches que celles qui sont autorisées, comme ça le thread n'est pas démarré inutilement à l'appui d'une touche invalide. Je vais essayer de te faire un petit code pour te montrer comment on pourrait modifier la classe Table dans ce sens.
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Voici comment on pourrait créer un Thread pour le traitement de plusieurs touches (au cas où un KeyListener ne suffise pas)

Remarque : je ne mets que le début de la classe Table, la fin de la classe et les autres fichiers sont les mêmes qu'hier.

package pack001;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.util.TreeSet;

import javax.swing.ImageIcon;

public class Table extends Ecran 
{
    private static final long serialVersionUID = 1;

    public Table(Panneau panneau)
    {
        super(panneau, "Jeu.png");
        
        addFocusListener(new FocusListener()
        {
            @Override
            public void focusGained(FocusEvent e)
            {                
            }

            @Override
            public void focusLost(FocusEvent e) 
            {
                keySet.clear();
                arreterGestionnaire();
            }
        });
    }
    
    private final TreeSet<Integer> keySet = new TreeSet<Integer>();
        
    private void traiterTouches()
    {
        for (int keyCode : keySet)
        {
            switch (keyCode)
            {
            case KeyEvent.VK_LEFT  :
                System.out.println("Gestionnaire de touches : flèche gauche");
                break;
            case KeyEvent.VK_RIGHT :
                System.out.println("Gestionnaire de touches : flèche droite");
                break;
            case KeyEvent.VK_C :
                System.out.println("Gestionnaire de touches : C");
                break;
            case KeyEvent.VK_A :
                System.out.println("Gestionnaire de touches : A");
                break;
            case KeyEvent.VK_Q :
                System.out.println("Gestionnaire de touches : Q");
                break;
            case KeyEvent.VK_P :
                System.out.println("Gestionnaire de touches : P");
                break;                
            }
        }
    }
        
    class GestionTouche extends Thread
    {
        @Override
        public void run()
        {
            System.out.println("Gestionnaire de touches : démarrage");
            
            while (true)
            {
                System.out.println("Gestionnaire de touches : traitement");
                traiterTouches();
                
                if (isInterrupted())
                    break;
                
                try 
                {
                    System.out.println("Gestionnaire de touches : pause");
                    Thread.sleep(1000);
                } 
                catch (InterruptedException e) 
                {
                    break;
                }                
            }
            
            System.out.println("Gestionnaire de touches : arrêt\n");
        }
    }
    
    private GestionTouche gestionnaire = null;
    
    private void demarrerGestionnaire()
    {
        if (gestionnaire == null)
        {
            gestionnaire = new GestionTouche();
            gestionnaire.start();
        }
    }
    
    private void arreterGestionnaire()
    {
        if (gestionnaire != null)
        {
            gestionnaire.interrupt();
            gestionnaire = null;
        }
    }
    
    @Override
    public void keyPressed(KeyEvent event)
    {        
        switch (event.getKeyCode())
        {
        // Mise en pause
    
        case KeyEvent.VK_SPACE :
            
            panneau.pause();
            
            return;
        
        // Autres commandes valides
            
        case KeyEvent.VK_LEFT  :
        case KeyEvent.VK_RIGHT :
        case KeyEvent.VK_C :
        case KeyEvent.VK_A :
        case KeyEvent.VK_Q :
        case KeyEvent.VK_P :
        
            keySet.add(event.getKeyCode());
            demarrerGestionnaire();            
            break;
        }        
    }
    
    @Override
    public void keyReleased(KeyEvent event)
    {
        keySet.remove(event.getKeyCode());
        
        if (keySet.isEmpty())
            arreterGestionnaire();
    }
    
//////////////////////////////////////////////
// LA SUITE EST COMME AVANT
//////////////////////////////////////////////
    
    private int xZone = 480;
    private int posYHRG = (int) (Math.random()*-20)-50;
    private int posYHRD = 0;
    private int posTire = 500;
    private int xTire = xZone +8;

// ...
0