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 :

Utilisation des threads


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 48
    Par défaut Utilisation des threads
    Bonjour, je suis actuellement entrain de coder un petit jeu et j'essaye de bien utiliser les threads mais rien à faire j'ai toujours des erreurs.. :/

    En gros, j'ai un vaisseau que je déplace latéralement avec la souris et qui peux tirer sur des astéroïdes qui se déplacent verticalement, pour l'instant c'est tout ce que j'essaye de faire.

    J'ai donc fait une classe que j'ai appelée "aireJeux" que j'ai ajouter à mon container de ma fenêtre et j'essaye de la réafficher toutes les x millisecondes avec une thread.

    Alors voici au début ce que j'ai fait :

    Tout d'abord il faut savoir que j'ai déclaré ma liste d'astéroïdes comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private ArrayList <Asteroide> arrayAsteroide = new ArrayList <Asteroide> ();
        private List <Asteroide> asteroides = Collections.synchronizedList(arrayAsteroide);
    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
     public AireJeux ()
        {
           this.setBounds(0, 0, WIDTHECRAN, HEIGHTECRAN);
           vaisseau = new Vaisseau("IMAGES/vaisseau.png", 305, 405);
           this.addKeyListener(new clavierListener());
           this.addMouseListener(new sourisListener());
           this.addMouseMotionListener(new bougeSourisListener());
     
           threadAffichage = new ThreadAffichage(this);
           Thread tAff = new Thread(threadAffichage);
           tAff.start();  
     
           threadPopAsteroide = new ThreadPopAsteroide(asteroides);
           Thread tPop = new Thread(threadPopAsteroide);
           tPop.start();
        }
     
    @Override public void paint (Graphics g)
         {
             super.paint(g);
     
             vaisseau.updateHitBox();
     
             g.drawImage(fond.getImage(), 0, 0, this);
             g.drawImage(vaisseau.getImage().getImage(), vaisseau.getPositionX(), vaisseau.getPositionY(), this);
             for(Tir tir : tirs)
             {
                 g.drawImage(tir.getImage().getImage(), tir.getPositionX(), tir.getPositionY(), this);
                 tir.setPositionY(tir.getPositionY() - tir.getVitesse());
                 if(tir.getPositionY() < 0)
                     tirs.remove(tir);
             }
             for(Asteroide asteroide : asteroides)
             {
                 asteroide.updateHitBox();
                 g.drawImage(asteroide.getImage().getImage(), asteroide.getPositionX(), asteroide.getPositionY(), asteroideRef.getIconWidth()/asteroide.getZoom(), asteroideRef.getIconHeight()/asteroide.getZoom(), this);
                 asteroide.setPositionY(asteroide.getPositionY() + asteroide.getVitesse());
                 if(asteroide.getPositionY() > HEIGHTECRAN || asteroide.collision(vaisseau.getTabHitBox()) == true)
                 {
                     asteroides.remove(asteroide);
                 }
     
             }
         }
    La thread d'affichage :

    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
    @Override public void run ()
        {
            while(continuer == true)
            {
                try
                {
                    Thread.sleep(15);
                }
                catch(Exception e)
                {
                    System.out.println(e.getMessage());
                }
     
                aireJeux.repaint();
            }
        }
    Et la thread de pop :

    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
     @Override public void run ()
        {
            while(continuer == true)
            {
                try
                {
                    Thread.sleep((long)(50 + (Math.random() * 450)));
                }
                catch(Exception e)
                {
                    System.out.println(e.getMessage());
                }
     
                if(asteroides.size() < 15)
                    asteroides.add(new Asteroide("IMAGES/asteroid.png", ((int)(0 + (Math.random() * 800))), -100, 4, (int)(1 + (Math.random() * 10))));
            }
        }
    Je pouvais jouer sans interruption mais j'avais cette erreur qui s'affichait en boucle :
    Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:819)
    at java.util.ArrayList$Itr.next(ArrayList.java:791)
    at View.AireJeux.paint(AireJeux.java:56)
    at javax.swing.JComponent.paintToOffscreen(JComponent.java:5221)
    at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1512)
    at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1443)
    at javax.swing.RepaintManager.paint(RepaintManager.java:1236)
    at javax.swing.JComponent._paintImmediately(JComponent.java:5169)
    at javax.swing.JComponent.paintImmediately(JComponent.java:4980)
    at javax.swing.RepaintManager$3.run(RepaintManager.java:796)
    at javax.swing.RepaintManager$3.run(RepaintManager.java:784)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:784)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:757)
    at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:706)
    at javax.swing.RepaintManager.access$1000(RepaintManager.java:62)
    at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1651)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:727)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:688)
    at java.awt.EventQueue$3.run(EventQueue.java:686)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:697)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
    Alors je me suis dit que même si ma liste était synchroniser les threads n'arrivaient pas à travailler sur la même liste en même temps..

    J'ai donc essayer de faire ceci :

    J'ai supprimer la thread "popAsteroide" pour l'inclure dans la thread d'affichage et j'ai enlever le remove() de ma fonction paint mais je l'ai placé dans ma thread d'affichage aussi..

    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
    @Override public void paint (Graphics g)
         {
             super.paint(g);
     
             vaisseau.updateHitBox();
     
             g.drawImage(fond.getImage(), 0, 0, this);
             g.drawImage(vaisseau.getImage().getImage(), vaisseau.getPositionX(), vaisseau.getPositionY(), this);
             for(Tir tir : tirs)
             {
                 g.drawImage(tir.getImage().getImage(), tir.getPositionX(), tir.getPositionY(), this);
                 tir.setPositionY(tir.getPositionY() - tir.getVitesse());
                 if(tir.getPositionY() < 0)
                     tirs.remove(tir);
             }
             for(Asteroide asteroide : asteroides)
             {
                 asteroide.updateHitBox();
                 g.drawImage(asteroide.getImage().getImage(), asteroide.getPositionX(), asteroide.getPositionY(), asteroideRef.getIconWidth()/asteroide.getZoom(), asteroideRef.getIconHeight()/asteroide.getZoom(), this);
                 asteroide.setPositionY(asteroide.getPositionY() + asteroide.getVitesse());
                 if(asteroide.getPositionY() > HEIGHTECRAN || asteroide.collision(vaisseau.getTabHitBox()) == true)
                 {
                     asteroide.setAAficher(true);
                 }
     
             }
         }
    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
    @Override public void run ()
        {
            while(continuer == true)
            {
                try
                {
                    Thread.sleep(15);
                }
                catch(Exception e)
                {
                    System.out.println(e.getMessage());
                }
     
                if((Math.random() * 100) <= 5)
                  aireJeux.getListAsteroide().add(new Asteroide("IMAGES/asteroid.png", ((int)(0 + (Math.random() * 800))), -100, 4, (int)(1 + (Math.random() * 10))));
     
                  for(Asteroide asteroide : aireJeux.getListAsteroide())
                  {
                    if(asteroide.getPositionY() > HEIGHTECRAN || asteroide.collision(aireJeux.getVaisseau().getTabHitBox()) == true)
                    {
                     aireJeux.getListAsteroide().remove(asteroide);
                    }
                  }
     
                aireJeux.repaint();
            }
        }
    Mais ici tout fonctionne sauf une fois qu'il y-à une collision. Là le jeu se bloque et m'affiche cette erreur :

    Exception in thread "Thread-1" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:819)
    at java.util.ArrayList$Itr.next(ArrayList.java:791)
    at vaisseaujava.ThreadAffichage.run(ThreadAffichage.java:33)
    at java.lang.Thread.run(Thread.java:722)
    Alors si quelqu'un pouvait m'aider et me dire laquelle des 2 façons est la meilleure ou bien si il faut que je change complétement de façon de faire et comment résoudre mon problème..? Merci d'avance :/

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Tu as deux problèmes qui se cumulent :
    - quand un thread parcourt une List, et qu'un autre la modifie pendant ce parcours, tu obtiens cette erreur.
    - pendant qu'on parcourt une liste avec un itérateur, donc y compris quand on utilise la syntaxe "for each", on ne doit pas modifier la liste (seule la méthode remove de l'itérateur permet de le faire);

    Il faut donc empêcher chaque thread d'accèder à cette List, mutuellement, et de modifier la liste pendant qu'on la parcourt, sauf par la méthode remove() de Iterator().

    Un moyen simple de le faire dans ton cas est d'utiliser le mot clef synchronized qui définit un bloc qui ne pourra être exécutée en même temps par 2 threads différents. Il faut bien sur s'arranger pour que toutes les modifications soient faites dans le bloc.

    Prenons le cas de ton premier essai :

    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
     @Override public void run ()
        {
            while(continuer == true)
            {
                try
                {
                    Thread.sleep((long)(50 + (Math.random() * 450)));
                }
                catch(Exception e)
                {
                    System.out.println(e.getMessage());
                }
     
                // on bloque l'accès à asteroides pendant l'éxécution du bloc
                // si un autre thread est déjà entrain de bloquer, on attends que ça se débloque
                synchronized(asteroides) {
                    if(asteroides.size() < 15)
                        asteroides.add(new Asteroide("IMAGES/asteroid.png", ((int)(0 + (Math.random() * 800))), -100, 4, (int)(1 + (Math.random() * 10))));
                }
            }
        }
    et dans ta méthode paint() :

    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
    @Override public void paint (Graphics g)
         {
              ...
     
            synchronized( asteroides ) {
     
             for(Iterator<Asteroide> iterAsteroide = asteroides.iterator(); iterAsteroide.hasNext(); )
             {
                 Asteroid asteroide = asteroides.next();
                 asteroide.updateHitBox();
                 g.drawImage(asteroide.getImage().getImage(), asteroide.getPositionX(), asteroide.getPositionY(), asteroideRef.getIconWidth()/asteroide.getZoom(), asteroideRef.getIconHeight()/asteroide.getZoom(), this);
                 asteroide.setPositionY(asteroide.getPositionY() + asteroide.getVitesse());
                 if(asteroide.getPositionY() > HEIGHTECRAN || asteroide.collision(vaisseau.getTabHitBox()) == true)
                 {
                     iterAsteroide.remove();
                 }
     
             }
     
           }
         }
    Toutefois cette méthode a un inconvénient : synchronizer dans le paint risque de bloquer l'ui (pendant un petit laps de temps, mais quand même)

    Je ferais 2 listes, une, principale, chargée de maintenir la liste d'asteroides, et qu'on modifie (ajout, suppression) dans un bloc synchronisé, et une pour afficher seulement (et sur laquelle on ne fait aucune autre modif que de la créer chaque fois qu'on fait une modification sur la liste principale) ; d'ailleurs je pense que la suppression de l'asteroide qui sort de l'écran devrais être faite en dehors du thread graphique. Le thread graphique doit être réservé au dessin et ne pas être perturbé par des manipulations qui n'ont rien à avoir avec le dessin lui-même.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 48
    Par défaut
    Bonjour, et un grand merci de ta réponse.

    J'ai plus ou moins suivi tes conseils, enfin, j'en ai suivis certains plutôt.
    Et j'ai au final un code qui fonctionne sans erreurs. Afin d'être sûr de ne pas faire de boulettes je vais quand même montrer ma solution :

    J'ai rajouter une thread qui gère les collision et j'ai modifier ma fonction paint comme ceci :

    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
    @Override public void paint (Graphics g)
         {
             super.paint(g);
     
             vaisseau.updateHitBox();
     
             g.drawImage(fond.getImage(), 0, 0, this);
             g.drawImage(vaisseau.getImage().getImage(), vaisseau.getPositionX(), vaisseau.getPositionY(), this);
             synchronized(tirs)
             {
                for(Tir tir : tirs)
                {
                    g.drawImage(tir.getImage().getImage(), tir.getPositionX(), tir.getPositionY(), this);
                    tir.setPositionY(tir.getPositionY() - tir.getVitesse());
                    if(tir.getPositionY() < 0)
                        tir.setAafficher(false);
                    synchronized(asteroides)
                    {
                        for(Asteroide asteroide : asteroides)
                        {
                            if(tir.collision(asteroide) == true)
                            {
                                asteroide.setAAficher(false);
                                tir.setAafficher(false);
                            }
                        }
                    }
                }
             }
             synchronized(asteroides)
             {
                for(Asteroide asteroide : asteroides)
                {
                    asteroide.updateHitBox();
                    g.drawImage(asteroide.getImage().getImage(), asteroide.getPositionX(), asteroide.getPositionY(), asteroideRef.getIconWidth()/asteroide.getZoom(), asteroideRef.getIconHeight()/asteroide.getZoom(), this);
                    asteroide.setPositionY(asteroide.getPositionY() + asteroide.getVitesse());
                    if(asteroide.getPositionY() > HEIGHTECRAN || asteroide.collision(vaisseau.getTabHitBox()) == true)
                    {
                        asteroide.setAAficher(false);
                    }
     
                }
             }
         }
    Ma thread de collision fonctionne comme ceci :

    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
    while(continuer == true)
            {
                try
                {
                    Thread.sleep(15);
                }
                catch(Exception e)
                {
                    System.out.println(e.getMessage());
                }
                int i;
     
                synchronized(aireJeux.getListAsteroide())
                {
     
                    for(i = 0; i < aireJeux.getListAsteroide().size(); i++)
                    {
                        if(aireJeux.getListAsteroide().get(i).isAfficher() == false)
                            aireJeux.getListAsteroide().remove(i);
                    }
                }
                synchronized(aireJeux.getListTir())
                {
                    for(i = 0; i < aireJeux.getListTir().size(); i++)
                    {
                       if(aireJeux.getListTir().get(i).isAfficher() == false)
                           aireJeux.getListTir().remove(i);
                    }
                }
            }
    Mon code ici fonctionne mais est-il "valable"?

    Merci d'avance.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Je me garderais bien de juger de la validité d'un code dans le forum, surtout à partir du code d'une méthode et demi Ca me prendrait déjà bien trop de temps, ça remplirait le forum, ça lancerait d'interminables débats entre partisans du ceci, ou du cela Il est trop tôt dans la semaine pour lancer un tel troll

    2 choses, toutefois :
    - comme je le disais précédemment : attention aux verrouillages trop longs dans l'EDT (un "synchronized sur x" bloque le thread courant si un autre thread est déjà entré dans un autre "synchronized sur x" (pour peu qu'il y en ai plusieurs, et ça peut attendre encore plus longtemps).
    - attention lorsqu'il y a plusieurs "variables de synchronisation" aux risques de deadlock (un thread 1 entre dans un block sync(A) dans lequel il y a un bloc sync(B), et un autre thread 2 entre dans un block sync(B) dans lequel il y a un bloc sync(A), avant que le thread 1 ne soit entré dans le sous block sync(B) : on va avoir :
    - Thread 1 qui bloque A, et qui attend que B se débloque
    - Thread 2 qui bloque B, et qui attend que A se débloque.
    Ils vont attendre très longtemps
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par Gurdile Voir le message

    Mon code ici fonctionne mais est-il "valable"?

    Merci d'avance.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(i = 0; i < aireJeux.getListAsteroide().size(); i++)
                    {
                        if(aireJeux.getListAsteroide().get(i).isAfficher() == false)
                            aireJeux.getListAsteroide().remove(i);
                    }
    Juste en regardant vite fait: ce code va sauter systématiquement l'asteroide qui suit celle que tu as retirée. Puisque toute la fin de liste avance de 1 mais ta boucle aussi avance de 1!

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Juste en regardant vite fait: ce code va sauter systématiquement l'asteroide qui suit celle que tu as retirée. Puisque toute la fin de liste avance de 1 mais ta boucle aussi avance de 1!
    Ah oui, bien vu (j'avais pas regardé le code, remarque:p) ! D'ailleurs, la boucle suivante, sur aireJeux.getListTir(), souffre du même problème.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 48
    Par défaut
    Merci pour vos réponses, si j'ai bien compris votre remarque, faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for(i = 0; i < aireJeux.getListAsteroide().size(); i++)
    {
            if(aireJeux.getListAsteroide().get(i).isAfficher() == false)
            {
                    aireJeux.getListAsteroide().remove(i);
                    i--;
            }
    }
    Résoudrai t-il ce "problème"?

    Sinon je ne vais pas non plus vous ennuyer jusqu'à avoir un code parfaitement "valable" car c'est vrai que ça pourrai susciter un long débat x)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Avis sur la bonne utilisation des Threads
    Par Pitivier dans le forum Général Java
    Réponses: 8
    Dernier message: 28/11/2006, 20h07
  2. connexion socket utilisant des threads
    Par alceste dans le forum C++
    Réponses: 16
    Dernier message: 14/10/2006, 12h00
  3. [Débutant]Utilisation des Threads
    Par maniolo dans le forum Débuter avec Java
    Réponses: 19
    Dernier message: 10/07/2006, 11h31
  4. Utilisation des threads
    Par Valinor dans le forum Linux
    Réponses: 2
    Dernier message: 30/11/2005, 16h41
  5. Utilisations des Threads
    Par phoenix440 dans le forum Réseau
    Réponses: 15
    Dernier message: 21/08/2005, 17h19

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