在有线程的游戏中使用锁



我正在尝试调试一款太空入侵者类型游戏的一些代码,在该游戏中,我们必须射杀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;
             }
          }
       }
    }
}

多发子弹有可能在同一帧中击中同一艘船吗?在经典的太空入侵者中,你只有一个子弹,但你正在处理一个列表,所以这是不一样的。如果两颗子弹击中同一艘船,你的内环"for(子弹子弹:子弹)"将处理两颗子弹撞击船只的过程,即使船只已经死亡,第二颗子弹也会再次减少计数器。如果你用"break"代替"continue",那么当飞船被杀时,子弹环就会停止,这可能是你的意图吗?

相关内容

  • 没有找到相关文章

最新更新