2015-12-01 1 views
2

Je suis en train de déboguer du code pour un jeu de type Space Invaders où il y a 20 vaisseaux extraterrestres que nous devons tirer. Le jeu affiche le nombre de navires actuellement sur l'écran. Lorsque vous tirez et détruisez un navire, le nombre total de navires devrait diminuer de 1 pour chaque navire détruit. Ainsi, pour 20 navires, lorsque vous photographiez tous les 20, l'affichage devrait indiquer "0" pour le nombre de navires restants. Cependant, pour une raison que je ne comprends pas, quand je tire sur tous les 20 navires, l'affichage montrera "-2" ou "-3" ce qui n'a aucun sens pour moi car il ne peut y avoir un nombre négatif de navires.en utilisant des verrous dans un jeu avec des threads

J'ai essayé de résoudre cette solution avec un ReentrantLock puisque ce jeu utilise plusieurs threads, mais je ne sais pas vraiment comment le faire correctement. Voici le segment qui vérifie si un navire étranger et balle entrent en collision (ce qui est quand le navire doit être détruit):

public void checkCollisions() 
{ 
    //check for alien ship and bullet collisions 
    for (AlienShip a : aships) 
    { 
    if (a.isAlive()) 
    { 
     //check for bullet collisions 
     for (Bullet bullet : bullets) 
     { 
      if (bullet.isAlive()) 
      { 
       //perform the collision test 
       if (a.getBounds().contains(bullet.getX(), 
             bullet.getY())) 
       { 
       bullet.setAlive(false); 
       a.setAlive(false); 
       shipLock.lock(); 
       try 
       { 
        int shipCount = aliveShips; 
        shipCount--; 
        aliveShips = shipCount; 
       } 
       finally 
       { 
        shipLock.unlock(); 
       } 
       continue; 
      } 
      } 
     } 
    } 
} 
+0

Cela dépend beaucoup des threads qui font quoi dans votre système. Y at-il plus d'1 appelant cette méthode? – zapl

Répondre

0

Est-il possible de plusieurs balles de frapper le même bateau dans le même cadre? Dans les envahisseurs spatiaux classiques, vous n'avez qu'une seule puce, mais vous traitez une liste de sorte que ce n'est pas la même chose. Si deux balles touchent le même vaisseau, votre boucle interne "pour (balle balle: balles)" traitera les deux balles heurtant le vaisseau et même si le vaisseau est mort, la deuxième balle diminuera à nouveau le marqueur. Si vous remplacez le 'continuer' par un 'break' alors la boucle de balle s'arrêtera quand le vaisseau est tué, ceci pourrait être votre intention?

+0

Oui c'est mon intention. Quand la balle est tuée par 1 balle, elle diminue le compteur. J'ai changé le 'continuer' en un' break' et cela a fonctionné. Merci beaucoup. Comment avez-vous su passer d'une pause continue? – GenericUser01

+0

'continuer' passera juste à la fin de la boucle qui l'entoure, puis * continuera * la boucle. 'break' va * sortir * de la boucle qui l'entoure. Au moins, c'est ainsi que je me souviens d'eux :) Si ma réponse est correcte, s'il vous plaît cliquez sur le bouton «accepter la réponse». – PeteB