2014-02-08 52 views
1

我想在用戶按下四個箭頭鍵(或wasd)時在簡單框架上移動字符。只要箭頭鍵被按下,角色應該繼續移動,並且一旦用戶釋放了鍵,該角色應該停止移動。Java - 在KeyPressed事件後立即調用KeyReleased

大多數情況下,這是移動。但是,當快速切換方向時,我會遇到一些奇怪的延遲。看起來,當我按下鍵盤按鈕時,java的keylistener將其解釋爲一個「點擊」鍵,在快速按下並釋放之前,確定該按鈕實際上處於按下狀態。

因此,玩家模型在其動作中有一點點結局。

我解釋正確嗎?這是我的代碼,如果任何人都可以理解這一點。

代碼來處理一個鍵釋放

@Override 
public void keyReleased(KeyEvent e) 
{ 

    switch(e.getKeyCode()) 
    { 

    case KeyEvent.VK_W: 
    case KeyEvent.VK_UP: 
    case KeyEvent.VK_A: 
    case KeyEvent.VK_LEFT: 
    case KeyEvent.VK_S: 
    case KeyEvent.VK_DOWN: 
    case KeyEvent.VK_D: 
    case KeyEvent.VK_RIGHT: 

     GameController.hero.stopMoving(); 
     break; 

    case KeyEvent.VK_SPACE: 
     break; 
    case KeyEvent.VK_ESCAPE: 
     break; 

    } 

    keyPress = false; 
} 

我的代碼來處理按鍵

@Override 
public void keyPressed(KeyEvent e) 
{ 

    keyPress = true; 
    keyCode = e.getKeyCode(); 


    switch(e.getKeyCode()) 
    { 


    case KeyEvent.VK_W: 
    case KeyEvent.VK_UP: 
     GameController.hero.setSpeedBase(new Point(0,-1)); 
     break; 
    case KeyEvent.VK_A: 
    case KeyEvent.VK_LEFT: 
     GameController.hero.setSpeedBase(new Point(-1,0)); 
     break; 
    case KeyEvent.VK_S: 
    case KeyEvent.VK_DOWN: 
     GameController.hero.setSpeedBase(new Point(0,1)); 
     break; 
    case KeyEvent.VK_D: 
    case KeyEvent.VK_RIGHT: 
     GameController.hero.setSpeedBase(new Point(1,0)); 
     break; 
     } 

}

我希望這是足夠的信息。任何幫助表示讚賞!讓我知道是否有任何澄清我可以做出。有沒有更簡單的方法來做到這一點?

+0

基本測試似乎對我來說工作得很好......也許是一個重複執行問題的可運行演示... – MadProgrammer

+0

我將包含一個可運行的jar演示。謝謝! – 13rave

+0

只是在開玩笑。我不知道如何做到這一點堆棧溢出:( – 13rave

回答

1

這是舊的文章,但對於未來的民間可能訪問這個網頁,這裏是我的回答

的KeyListener的處理按鍵作爲一個文本編輯器。當你拿着一把鑰匙時,你會注意到編輯開始重複它之前有一段延遲。

要在Java中的比賽中,我們一般讓另一個線程來處理輸入的KeyListener的只是改變了檢查在遊戲循環

我做了這個視頻前一段時間一些標誌,字幕用葡萄牙語,但代碼在可見的字體大小。

https://www.youtube.com/watch?v=f7M9eAkNS8s

最好的問候。

相關問題