2015-12-01 40 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