2013-03-11 100 views
2

我和我正在研究一種遊戲,基本上,我們有一個擊中格設立在那裏,如果我們的性格撞擊它(蜘蛛),字符失去健康的朋友。遊戲計時器延遲損害

因爲我們使用一個for循環中,不可避免的發生了,玩家通過1失去他們的健康1,但如此之快,人眼無法看到它。因此,我們需要一個計時器,暫停,或者每玩家擊中蜘蛛的x時間量。這裏是我們的代碼:

 if (ResetEntities.spiderObj.intersects(ResetEntities.blueCharacterObj)) { 
     try { 
      Thread.sleep(10); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     for (int i = 0; i < 100; i++) { 
      if (ResetEntities.blueHealth < 0) { 
       ResetEntities.blueHealth = 0; 
       Frame.blueHealthLabel.setText("Health: " 
         + ResetEntities.blueHealth); 
      } else { 
       ResetEntities.getBlueHealth(ResetEntities.blueHealth - 1); 
       Frame.blueHealthLabel.setText("Health: " 
         + ResetEntities.blueHealth); 
      } 
     } 
    } 

在這段代碼中,我們有一個if語句來檢查相交。我試圖睡覺劇本,(我意識到10速度非常快,但是1000落後於可怕,所以Thread#sleep不是我想象的方式)。然後我們有一個運行100次的聲明(作爲球員的健康狀況)。然後我們有一個如果看到健康是否低於0,回到0,所以玩家不能得到負面的健康。如果它不低於0,我們做其他的並且減去1生命值。但正如我所說,這跑得太快,看不到。

任何幫助?

+0

您的代碼是一種方法。嘗試睡眠100L到200L毫秒。 – 2013-03-11 15:41:48

+1

如果你想在'Java'遊戲中設置'Timer',我建議你使用'javax.swing.Timer'而不是'Thread'。 – Rob 2013-03-11 15:45:31

回答

1

使用Timer爲您的後臺進程的時間。並使用javax.swing.SwingUtilities.invokeLater(Runnable)更新您的GUI。

2

傳統的方式 - 在我看來最好的方法 - 做到這一點,是讓受傷的角色無懈可擊,直到特定的時間點:當角色受傷時,檢查遊戲時間線(或者如果你沒有然後是當前的毫秒數),然後添加特定的時間,例如1秒(或依賴於角色的恢復時間)並記住角色對象中的時間戳。想要首先傷害角色的gametick會檢查角色是否仍然隱藏在無敵之中。這是特別好的,因爲通常情況下不需要多線程更新遊戲狀態。

1

這個問題還不清楚,但你問你如何能阻止健康如此快速下降?如果是這樣,這是我會做的:

你應該有一個int值invincibilityTime並設置爲100,一旦玩家被擊中,然後每次你的遊戲通過gameloop時,它減少1。在(ResetEntities.spiderObj.intersects(ResetEntities.blueCharacterObj))前面加上if(invincibilityTime <= 0),檢查是否過期。