在线程游戏中使用锁

using locks in a game with threads

我正在尝试为 space 入侵者类型的游戏调试一些代码,其中有 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;
             }
          }
       }
    }
}

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