2011-08-27 23 views
1

我正在研究Java遊戲,並且我遇到了KeyListeners/KeyBinding存在問題。我基本上想要做的是暫時禁用鍵盤/不允許動畫發生時輸入更多的輸入。該動畫是通過更新數據生成的。Java KeyListeners/KeyBinding - 清除緩衝區 - Java遊戲開發

我目前得到的是,我按動畫的關鍵點,動畫開始,然後按另一個鍵來完成其他功能。它被添加到keyboardlistener的堆棧/隊列(?),並在第一個動畫完成時觸發。

我正在使用實現KeyListener的JPanel。

爲了讓代碼的想法:

public void keyPressed(KeyEvent arg0) { 
     //Prevents Repeated keys 
     pressed.add(arg0); 
     if (pressed.size() == 1) { 
      int key = ((KeyEvent) pressed.toArray()[0]).getKeyCode(); 
      if (key == KeyEvent.VK_ENTER) { 
       doSomeAnimation(); 
      } else if (key == KeyEvent.VK_SPACE) { 
       doADifferentAnimation(); 
      } 
      Update(); 
    } 
} 

事情我已經嘗試:

1)設置可聚焦(假)在JPanel中調用動畫之前。然後設置可調焦(真),並在焦點完成時抓住焦點。

2)使用布爾值來跟蹤動畫發生的時間。

3)使用密鑰綁定。

無論我用什麼方法,我總是會遇到這樣的問題,即在動畫發生時我仍然會從鍵盤輸入內容。然後,一旦該動畫完成,它會轉到堆棧/隊列(?)中的下一個元素並處理它。另外,這些動畫需要多次出現(所以使用一組布爾值來驗證它是否已經被執行並不會有幫助)。

因此,如果您有任何想法或幫助(或指向我的地方),將不勝感激。

一些額外信息:Java 1.6,IDE Eclipse,MVC結構。 (有問題的是控制器/型號)

回答

1

假設您的動畫由javax.swing.Timer實例驅動,則有問題的隊列是EventQueue,它按Timer以「排列順序相同」的順序運行事件。由於阻止主機平臺上的其他設備不能喚起您的聽衆是不切實際的,因此您必須跟蹤應用程序中的效果。作爲一個具體的例子,這個game有幾個重載模型的move()方法來處理來自不同來源的輸入:鍵盤,鼠標或動畫計時器。定時器可以打開或關閉以查看其效果。這個example用自定義實現取代了EventQueue,也可以提供一些見解。

+1

+1 plus http://download.oracle.com/javase/tutorial/uiswing/misc/keybinding.html – mKorbel

+0

@mKorbel:好的觀察結果; [示例](http://stackoverflow.com/questions/3158254/how-to-replace-the-awt-eventqueue-with-own-implementation)突出了當[鍵綁定](http:///download.oracle.com/javase/tutorial/uiswing/misc/keybinding.html)未使用。 – trashgod

+0

我沒有使用計時器,但感謝您幫助我。您提供的這些鏈接非常有用。 :)我通過使用替換eventqueue和設置可調焦的混合來解決問題。 – aoi