2017-01-25 47 views
0

我有一個遊戲,您可以通過在按下按鍵時將子彈添加到控制器類來發射子彈。這裏是來自KeyPressed()的代碼 ;在拍攝之間添加延遲(按鍵)

else if (key == KeyEvent.VK_Q && !is_shooting) 
    { 
     is_shooting = true; 
     c.addBullet(new Bullet(p.getX(), p.getY(), this)); 
    } 

從KeyRealeased:

 else if (key == KeyEvent.VK_Q) 
    {    
     is_shooting = false; 
    } 

原樣,可以拍攝多達你想要多,is_shooting剛從按住按鍵後停止。我希望它能在拍攝完之後有一個冷卻時間,然後才能拍攝下一張照片。我嘗試使用Thread.Sleep,但這也會使角色在冷卻期間無法移動。任何幫助表示讚賞。

+0

'Thread.sleep'不鎖定您的播放器,但整個事件隊列,如果直接執行它在關鍵處理方法中。基本上完整的GUI凍結。 – Paul

回答

1

有了這樣一個小小的環境,很難百分之百的解決您的緊急問題。

我過去做過的一件事情是,記錄特定事件觸發的時間,比較時間差異與上次觸發時間的差異,並且如果某個時間閾值已經過去,允許發生該操作,否則忽略它

喜歡的東西...

long timeNow = System.currentTimeMillis(); 
long time = timeNow - timeOfLastProjectile; 
if (time < 0 || time > 1000) { 
    timeOfLastProjectile = timeNow; 
    // Trigger associated action 
} 

作爲一個例子。

我可能會使用這種方法的一個原因是,如果我有很多傳入事件需要處理並且不想爲了管理系統資源而觸發新線程或Timer,但是這種決定需要額外的問題背景。

還與氣墊船全鰻魚同意,你會使用按鍵綁定API的更好

+0

非常感謝! – Brandyn

1

您的代碼看起來是來自Swing GUI - 您不說,但真的應該,因爲它是關鍵信息,如果不是真的話,將徹底改變方法。如果這是真的,那麼不要使用Thread.sleep,因爲如果在GUI的事件線程上調用會使整個GUI處於休眠狀態,從而使其無用。請使用擺動計時器(請查看Swing Timer Tutorial瞭解更多信息)。定時器的ActionListener的actinPerformed方法將被重複調用,直到您在定時器上調用stop(),而不是調用for循環。問題:如果這是一個Swing GUI,最好使用Key Bindings而不是KeyListener。更多關於這方面的信息:Key Bindings Tutorial

+0

不反對我們的迴應(+1),這可能是OP最簡單的解決方案,過去我也曾經評估過最後一次觸發「動作」並計算出時間上的差異,除非指定閾值已經過去,忽略了觸發器,但由於問題的背景非常多,所以很難知道哪種解決方案最適合;) – MadProgrammer

+0

@MadProgrammer:and .... done!謝謝! –

+0

很高興有人喜歡我的回答;) – MadProgrammer