在线程游戏中使用锁

时间:2015-12-01 02:28:59

标签: java multithreading locking game-development

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

1 个答案:

答案 0 :(得分:0)

多个子弹是否可能在同一帧中击中同一艘船?在经典的太空入侵者中,你只有一颗子弹,但是你正在处理一个列表,所以这不一样。 如果两颗子弹击中同一艘船,那么你的内环就是(子弹子弹:子弹)"将处理两颗子弹撞击船只,即使船已经死亡,第二颗子弹将再次减少计数器。 如果您更换“继续”'随着“休息”#39;然后当船被杀时子弹循环将停止,这可能是你的意图吗?