IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Java Discussion :

Probleme avec JPanel


Sujet :

Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 11
    Par défaut Probleme avec JPanel
    Bonjour,

    Je débute en java et je me suis lancé dans un projet, un mini jeux genre space invader. Seulement j'ai un problème que je n'arrive pas à résoudre ^^'

    En faite j'ai une classe qui crée la fenetre de jeu, une autre qui crée un JPanel et dessine le joueur dans la fenetre de jeu. Jusque là tout va bien ^^

    Seulement j'ai une autre classe qui crée un objet que j'aimerais dessiner dans ma fenetre de jeu mais je ne vois vraiment pas comment faire

  2. #2
    Membre Expert
    Avatar de slim_java
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2008
    Messages
    2 272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Par défaut
    Bienvenue sur Developpez.com

    Pour faire du dessin en java, tu dois redéfinir la méthode paintComponent de ton JPanel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class panneau extends JPanel
    {
    [...]
    protected paintComponent(Graphics g)
    {
     
    // opérations de dessin ...
     
    }
     
    }
    Voila comme première réponse à ta question.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 11
    Par défaut
    C'est exactement ce que j'utilise pour dessiner mon Joueur ^^

    Mais en faite là où je bloque c'est pour rajouter un autre "dessin". Je m'explique :

    j'ai une classe KeyListener qui lorsque l'on appuie sur la touche espace crée un objet A et c'est cette objet A que je voudrais dessiner sur mon Panel.

    ( je sais pas si je suis sufisament explicite )

  4. #4
    Membre Expert
    Avatar de slim_java
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2008
    Messages
    2 272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Par défaut
    Citation Envoyé par oskko Voir le message
    j'ai une classe KeyListener qui lorsque l'on appuie sur la touche espace crée un objet A et c'est cette objet A que je voudrais dessiner sur mon Panel.

    Je peux pas te donner une réponse exacte, car cela dépend de ton code, mais tu peux par exemple mettre les objets à dessiner dans un vecteur, par la suite, dans la méthode paintComponent, tu fais le parcours de ce vecteur et tu fais le dessin de ces objets.

    Après l'appui sur la touche espace, tu ajoute l'Objet A à ce vecteur et tu fais un appel explicite à la méthode paintComponent() avec l'instruction:


  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 11
    Par défaut
    Huum, je penses que le mieu serait de vous montrez mon code. Est ce que je pourrais vous l'envoyer par mail ou en le postant sur pastebin ?

  6. #6
    Membre Expert Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Par défaut
    Tu peux directement le poster sur ce post
    Pour compléter la réponse de slim_java, Il faut que tu stock toutes les instances à dessiner dans un Conteneur (vecteur, list,...) de type IDrawable :
    L'interface IDrawable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    import java.awt.Graphics;
    import java.awt.Rectangle;
     
    public interface IDrawable {
    	public  void draw(Graphics g);
    	public Rectangle getRectangle();     
    }
    Ensuite il faut que les objets à dessiner ( par exemple joueur) implémente IDrawable et qu'il redéfinisse draw :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class Joueur implements IDrawable{
     private Image image = new ImageIcon("./data/img/dott2.gif").getImage();//Image du personnage
    private int posX, posY;
     
     /** Dessin du joueur */
        public void draw(Graphics g) {
             g.drawImage(image, posX, posY, null);
        }
    Pour terminer, ton panel doit parcourir le conteneur contenant les objets à dessiner et appeler la méthodes draw pour chacun d'eux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     public void paintComponent(Graphics g) {
    //Ici mon conteneur est une liste qui contient x objet IDrawable
    for(int i=0;i<listDessin.length;i++){
          listDessin.get(i).draw(g);
    }
    }

  7. #7
    Membre Expert
    Avatar de slim_java
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2008
    Messages
    2 272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Par défaut
    Citation Envoyé par oskko Voir le message
    Huum, je penses que le mieu serait de vous montrez mon code. Est ce que je pourrais vous l'envoyer par mail ou en le postant sur pastebin ?

    Mieux vaudrait poster ton code. Ça pourrait servir d'autres pouvant avoir le même problème.
    Tu auras une réponse de ma part(je reviens la nuit ) ou de la part d'un autre membre.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 11
    Par défaut
    D'accord, je vais voir déja avec ça ce que je peux faire

    Merci

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 11
    Par défaut
    Bon voila, il m'a fallu le temps pour me renseigner et bien comprendre le code que tu m'as montré ^^

    J'ai aussi modifié une bonne partie de mon code qui me semble plus claire maintenant. Ceci dit j'ai quand meme un soucis en utilisant le code que tu m'as montré, j'ai une erreur à la compilation de la classe Player

    Voici l'erreur :

    Player is not abstract and does not override abstract method getRectangle in IDrawable
    public class Player implements IDrawable{

    1 error

    Et voici le code de mes différentes classes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    import java.awt.*;
    import javax.swing.ImageIcon;
     
    public class Player implements IDrawable{
     
    	private Image image = new ImageIcon("./vaisseau.png").getImage();
    	private int x, y, theta = 40;
    	private Dimensions dim; // dimension de la fenetre de jeu
     
    	Player(Dimensions dim){
    		System.out.println("Creation de l'objet \" Player \" ! ");
    		this.dim = dim;
    		x = ( dim.getWidth() / 2 ) - theta;
    		y = ( dim.getHeight() / 2 ) - theta;
    	}
     
    	public void draw(Graphics g) {
                                  g.drawImage(image, x, y, null);
                   }	
    	[...]
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    import java.awt.*;
    import javax.swing.JPanel;
     
    public class Panneau extends JPanel{
     
    	private Dimensions gameFrameDim;
    	private Player player;
     
    	Panneau(Dimensions gameFrameDim){
    		System.out.println("Creation de l'objet \"Panneau\" ! ");
    		/* recuperation des dimensions de la frame de jeu */ 
    		this.gameFrameDim = gameFrameDim;
    	}
     
    	/* affichage du player */
    	public void paintComponent(Graphics g){
    		player.draw(g);
    	}
     
                   /* recuperation de l'objet player */
    	public void getPlayer(Player player){
    		this.player = player;
    	}
    }

  10. #10
    Membre Expert Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Par défaut
    Player is not abstract and does not override abstract method getRectangle in IDrawable
    C'est tout à fait normal comme erreur.
    IDrawable possède 2 méthodes : draw & getRectangle.
    Quand on implémente une interface on est OBLIGE de redéfinir les méthodes qu'elle possède (sauf si la classe est abstraite mais ça c'est une autre histoire ).
    Donc 2 solutions s'offre à toi :
    Soit supprimer la méthode getRectangle de l'interface IDrawable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public interface IDrawable {
    	public  void draw(Graphics g);
    	//public Rectangle getRectangle();     <-- A supprimer
    }
    Soit redéfinir getRectangle dans les classes qui implémente IDrawable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class Joueur implements IDrawable{
     private Image image = new ImageIcon("./data/img/dott2.gif").getImage();//Image du personnage
    private int posX, posY;
    private int largeur, hauteur
     
     /** Dessin du joueur */
        public void draw(Graphics g) {
             g.drawImage(image, posX, posY, null);
        }
    /** Retourne le rectangle englobant le joueur*/
    public Rectangle getRectangle(){
    return new Rectangle(posX,posY,largeur,hauteur);
    }
    Si je peux me permettre un conseil ça serais de redéfinir getRectangle()
    Pourquoi?
    Tous simplement pour gérer les collisions.
    Imaginons que tu ai ton joueur & une liste<Idrawble> contenant des météorite.
    Il faut vérifier si les météorite touchent le joueur... rien de plus simple avec getRectangle et la méthode intersects() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for(int i=0;i<listMeteorite.length;i++){//Parcours la liste des météorites
    if(listMeteorite.get(i).getRectangle().intersects(monJoueur.getRectangle())){
    //Le rectangle englobant la météorite et la rectangle englobant le joueur se chevauche
    //Donc collision, le joueur perd un point de vie par exemple
    monJoueur.setNombreDePV(monJoueur.getNombreDePV--);
    }
    J'espère avoir été clair, sinon n'hésite pas à demander des explications sur les points que tu n'aurais pas compris

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 11
    Par défaut
    Ok d'accord bon et bien je vais pouvoir continuer mon codage maintenant

    En tout cas, un grand merci

  12. #12
    Membre Expert
    Avatar de slim_java
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2008
    Messages
    2 272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Par défaut
    Salut,

    Je vois bien que Ivelios a donné une somme de code qui répond bien à ton besoin...déja lui est entrain de développer un Jeu en java et j'attends qu'il nous publie cet œuvre

    sinon, je te propose un article qui contient déjà pas mal d'informations sur le dessin en Java.

  13. #13
    Membre Expert Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Par défaut
    déja lui est entrain de développer un Jeu en java et j'attends qu'il nous publie cet œuvre
    ça avance plutôt lentement a vrai dire
    2 semaines de codage - 2 mois à réfléchir - Et la je mis remets (vacances)
    Le soucis c'est que j'ai la technique mais pas le game play

    Bon j'arrête d'utiliser ton post oskko, bonne chance pour ton jeu

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 11
    Par défaut
    Bonjour

    C'est encore moi J'ai de nouveau un ou deux petits soucis.

    En faite, le déplacement de mon joueur est ... particulier en faite lorsque j'appuie une fois sur la flèche du haut par exemple, il monte " instantanément " en revanche si je reste appuyé sur la touche, il met 1 - 2 sec avant de se mettre à bouger ... Je me demandais si c'était possible de modifier ça ?

    Et sinon, la collision missile - ennemi, j'ai du mal J'ai essayé avec
    if(ennemi.getRectangle().intersects(missile.getRectangle())) mais en faite sur 10 ennemis qui avancent ça ne marche toujours que sur le dernier. J'ai essayé pas mal de chose mais sans succès...

    Est ce que vous auriez une idée à me proposer svp ??

  15. #15
    Membre Expert
    Avatar de slim_java
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2008
    Messages
    2 272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Par défaut
    Salut,


    On a besoin d'avoir une idée sur le code que tu as écris concernant la partie déplacement des joueur et la collision.

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 11
    Par défaut
    Voici le code :

    Pour le déplacement du joueur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    public void keyPressed ( KeyEvent ke ){
            int keyp = ke.getKeyCode();
            switch(keyp){
                case KeyEvent.VK_UP:
                    if( y > 0){
                        y = y - 10;
                        player.setY(y);
                        gameWindow.repaintWindow();
                    }
                break;
     
                case KeyEvent.VK_DOWN:
                    /** pour rester dans la fenetre */
                    if( y < gameWindowDim.getWidth() - 60){
                        y = y + 10;
                        player.setY(y);
                        gameWindow.repaintWindow();
                    }
                break;
     
                case KeyEvent.VK_LEFT:
                    if( x > 0){
                        x = x - 10;
                        player.setX(x);
                        gameWindow.repaintWindow();
                    }
                break;
     
                case KeyEvent.VK_RIGHT:
                    /** pour rester dans la fenetre */
                    if( x < gameWindowDim.getHeight() - 50 ){
                        x = x + 10;
                        player.setX(x);
                        gameWindow.repaintWindow();
                    }
                break;
    }
    Et pour les collisions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    /** Test de collision PROJECTIL vs ENNEMI, 'bruteforce' tous les missiles comparés avec tous les ennemis */     
        public void calculCollision(){
            for(Iterator iter = drawableEnnemi.iterator(); iter.hasNext();){
                Ennemi e = (Ennemi) iter.next();
                for(Iterator iterator = drawableProjectil.iterator(); iterator.hasNext();){
                    Projectils p = (Projectils) iterator.next();
                    if(p.getRectangle().intersects(e.getRectangle())){
                        e.interruptThread(true);
                        p.interruptThread(true);
                    }
                }
            }
        }
    En faite, j' interromps le thread qui fait avancer mon projectile et mon ennemi parce que si je supprime l'ennemi et le projectile de la liste drawableEnnemi et drawableProjectil, j'ai une erreur

  17. #17
    Membre Expert Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Par défaut
    Pour le déplacement le problème ne serrait pas un truc du genre
    j'ai une erreur
    Donne nous le code de Projectiles, Ennemi et la façon dont tu remplie les iterateurs. Et aussi l'erreur qu'il te donne

    Edit : autre chose qui me parait très très suspect, tu as un Thread pour chaque ennemi et pour chaque projectile

    Pour faire propre et éviter de futur problème il faut que tu n'utilise que 2 Thread
    1 pour faire les calcul des positions et 1 pour l'affichage (et 1 pour le son si tu veux en mettre)
    Et pour faire le mouvement des missiles il faut qu'il possèdes des attributs vitesseX et vitesseY, positionX et position Y, width et height
    Ensuite tu pour déplacer les missiles tu parcours ta liste (toutes les Xms (je te conseille 10)) de missile et tu fais juste : (en supposant que les missiles aille en ligne droite)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    positionX+=vitesseX;
    positionY+=vitesseY

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 11
    Par défaut
    Pour ennemi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    public class Ennemi  implements IDrawable{
     
        private Image image = new ImageIcon("./ennemi.png").getImage();
        private int x,y;
        private int largeur = 40, hauteur = 25;
        private Dimensions dim;
        private Panneau pan;
        private myThreadEnnemi th;
        private Projectils projectil;
     
        Ennemi(Dimensions dim){
            System.out.println("Creation de l'objet \" ennemi \" ! ");
            this.dim = dim;
            Random r = new Random();
            // pour pas sortir de la fenetre de jeu
            x = 0 + r.nextInt(dim.getWidth()/2 + 85);
     
            y = 0;
        }
     
        public void goTrajectoire(){
            th = new myThreadEnnemi();
     
            th.getCoord(x,y);
            th.getFrameDim(dim);
            th.getEnnemi(this);
            th.getPanneau(pan);
            /* on envoie notre projectil dans la liste des drawables */
            pan.addDrawableEnnemi(this);
            th.start();
        }
     
        public void draw(Graphics g) {
            g.drawImage(image, x, y, null);
        }    
     
         /* retourne un rectangle englobant l ennemi */
        public Rectangle getRectangle(){
            return new Rectangle(x,y,largeur,hauteur);
        }
     
        public void setCoord(int x, int y){
            this.x = x;
            this.y = y;
        }
        [...]
    }
    et pour le projectile c'est quasiment pareil :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    import java.awt.*;
    import javax.swing.ImageIcon;
     
    public class Projectils implements IDrawable{
     
        private Image image = new ImageIcon("./missile.png").getImage();
        private int x, y, largeur = 10, hauteur = 20; /** x et y coordonnée de lancement */ 
        private Dimensions dim;
        private Player player;
        private GameWindow gameWindow;
        private Panneau pan;
        private myThread th;
     
        Projectils(int x, int y, Panneau pan){
            System.out.println("Creation de l'objet \" Projectils \" ! ");
            this.x = x;
            this.y = y;
            this.pan = pan;
        }
     
        public void draw(Graphics g){
            g.drawImage(image, x, y, null);
        }
     
         /** retourne un rectangle englobant le projectil */
        public Rectangle getRectangle(){
            return (new Rectangle(this.x,this.y,largeur,hauteur));
        }
     
        public void goTrajectoire(){
            /**  Déplacement du projectile */
            th = new myThread();
     
            /** + 15 pour center plus ou moins le missile devant le vaisseau*/
            th.getCoord(x + 5,y);
            th.getFrameDim(dim);
            th.getProjectil(this);
            th.getGameWindow(gameWindow);
            th.getPanneau(pan);
            /** on envoie notre projectil dans la liste des drawables */
            pan.addDrawableProjectil(this);
            /** lancement du thread de deplacement du projectile */
            th.start();
        }
     
        public void getFrameDim(Dimensions dim){
            this.dim = dim;
        }
     
        public void setCoord( int x, int y){
            this.x = x;
            this.y = y;
        }
       [...]
    }
    Et l'erreur, c'est en faite du au faite que je modifies mes Listes drawableEnnemi et drawableProjectil lorsqu'il y a collision :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     /** Test de collision PROJECTIL vs ENNEMI, 'bruteforce' tous les missiles comparer avec tous les ennemis */     
        public void calculCollision(){
            for(Iterator iter = drawableEnnemi.iterator(); iter.hasNext();){
                Ennemi e = (Ennemi) iter.next();
                for(Iterator iterator = drawableProjectil.iterator(); iterator.hasNext();){
                    Projectils p = (Projectils) iterator.next();
                    if(p.getRectangle().intersects(e.getRectangle())){
                        e.interruptThread(true);
                        p.interruptThread(true);
                        delDrawableEnnemi(e);
                        delDrawableProjectil(p);
                    }
                }
            }
        }
     
        public void addDrawableEnnemi(IDrawable d){
            drawableEnnemi.add(d);
            repaint();
        }
     
        public void addDrawableProjectil(IDrawable d){
            drawableProjectil.add(d);
            repaint();
        }
    Du coup il me dit :
    Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException

    at java.util.LinkedList$ListItr.checkForComodification<Unknown Source>
    at java.util.LinkedList$ListItr.next<Unknown Source>
    at Panneau.calculCollision<Panneau.java:69>
    at Panneau.paintComponent<Panneau.java:60>
    at javax.swing.JComponent.paint<Unknown Source>
    at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered<Unknown Source>

    at javax.swing.RepaintManager$PaintManager.paint(Unknown Source)
    at javax.swing.RepaintManager.paint(Unknown Source)
    at javax.swing.JComponent._paintImmediately(Unknown Source)
    at javax.swing.JComponent.paintImmediately(Unknown Source)
    at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
    at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
    at javax.swing.RepaintManager.seqPaintDirtyRegions(Unknown Source)
    at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unkno
    )
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

    Et sinon, avec un seul Thread je pourrais lancer plusieurs missiles ? C'est pour ça que j'avais faire un nouveau thread à chaque fois ^^'

  19. #19
    Membre Expert Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Par défaut
    at Panneau.calculCollision<Panneau.java:69>
    Qu'es ce qu'il y a à la ligne 69?

    Le code de collision à l'air bon à première vue.
    Peut-être une erreur dans delDrawableEnnemi ou delDrawableProjectil.
    Ou dans interruptThread -> Mais normalement tu n'as plus besoin de thread pour chaque ennemie et projectil . Mais juste 1 thread général.

  20. #20
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 11
    Par défaut
    Du coup je modifies tout mon code pour n'utiliser plus qu'un seul thread pour les projectiles et un autre pour les ennemis

    A dans 10 h

Discussions similaires

  1. probleme avec JPanel et JScrollPane
    Par josephgl dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 15/05/2010, 10h49
  2. probleme avec JPanel
    Par riadhhwajdii dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 13/10/2009, 11h52
  3. Probleme avec mon code : Comment changer de JPanel
    Par serialkilled dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 17/12/2006, 10h13
  4. Probleme avec les JPanel dans les JSplitPane
    Par L4BiN dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 16/08/2006, 14h29
  5. [debutant][swing] Probleme avec un Jpanel
    Par JeanMoul dans le forum Débuter
    Réponses: 6
    Dernier message: 27/08/2005, 19h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo