2015-12-01 43 views
2

我想调试一些空间入侵者类型游戏的代码,其中有20艘外星飞船,我们必须拍摄。游戏显示当前在屏幕上的船只数量。当你射击并摧毁一艘船时,每艘被摧毁的船只的船舶总数应减1。因此,对于20艘船舶,当你拍摄全部20艘时,显示器应该为剩余的船舶数量表示“0”。但是,由于某些原因,我不明白,当我拍摄所有20艘船时,显示屏将显示“-2”或“-3”,这对我来说没有意义,因为不能有负数的船只。在线程游戏中使用锁

我试图修复这个解决方案的ReentrantLock,因为这个游戏使用多线程,但并不真正知道如何正确地做到这一点。下面是检查是否一个外星飞船和子弹碰撞(也就是当船舶应被销毁)段:

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

很大程度上取决于哪些线程在您的系统中执行什么操作。有更多的人调用这个方法吗? – zapl

回答

0

是否有可能为多发子弹击中同一艘船在同一帧?在经典的太空侵略者中,你只有一颗子弹,但是你正在处理一个列表,所以这是不一样的。 如果两颗子弹击中同一艘船,你的内部循环“for(Bullet bullet:bullets)”将处理两颗子弹击中船只,即使船只已经死亡,第二颗子弹也会再次减少计数器。 如果用'break'代替'continue',那么子弹循环会在船舶死亡时停止,这可能是你的意图吗?

+0

是的,这是我的意图。当子弹被一颗子弹击中时,它会减少计数器。我把'continue'换成了'break',它起作用了。非常感谢。你怎么知道把它从一个继续改变到一个休息? – GenericUser01

+0

'continue'将跳转到封闭循环的末尾,然后*继续循环。 'break'将*从封闭循环中分离出来。至少,这就是我对他们的记忆:)如果我的回答是正确的,请点击'接受答案'按钮。 – PeteB