2013-05-05 32 views
-1

好吧,我正在爲學校製作一款2D側面滾輪遊戲。這幾乎就像馬里奧(當然,這是我完成時的希望)。當我按下右箭頭鍵將我的球員沿着地圖移動時,他移動一次,暫停,然後開始順利移動很多。我認爲這是因爲當你按下一個鍵時所有蘋果筆記本電腦都停頓了,但我不知道如何解決這個問題。有什麼建議?謝謝。如何讓按鍵不停頓?

+1

@ syb0rg:是的,該解決方案使用鍵綁定和Swing Timer。 – 2013-05-05 21:30:20

回答

1

一個解決方案是在keypressed方法內部設置boolean keyUP = true,在keyreleased方法內部設置keyUP = false。這樣,一旦按鍵被按下,你的遊戲將這個註冊爲"keep moving up",直到你釋放密鑰,而不是"Up was pressed move up, up was pressed move up....".這就消除了輸入時的初始延遲(非常顯着的Linux)。

從我們的遊戲:

private boolean up, down, left, right; 

public void keyReleased(KeyEvent e) { 
    switch (e.getKeyCode()) { 
    case KeyEvent.VK_S: 
     down = false; 
     break; 
    case KeyEvent.VK_W: 
     up = false; 
     break; 
    case KeyEvent.VK_A: 
     left = false; 
     break; 
    case KeyEvent.VK_D: 
     right = false; 
     break; 
    } 
} 


public void keyPressed(KeyEvent e) { 
    switch (e.getKeyCode()) { 
    case KeyEvent.VK_S: 
     down = true; 
     break; 
    case KeyEvent.VK_W: 
     up = true; 
     break; 
    case KeyEvent.VK_A: 
     left = true; 
     break; 
    case KeyEvent.VK_D: 
     right = true; 
     break; 
+0

這工作!非常感謝! – GrayW3 2013-05-05 21:36:46

+0

歡迎:) – arynaq 2013-05-05 22:28:22

1

雖然你還沒有發送的任何代碼段,我可以承擔以下。我認爲你已經實現了按鍵監聽器,當按下按鍵時會執行某些操作。如果用戶仍然按下按鍵,程序會在延遲一段時間後獲得第二個事件,然後開始更快地獲取事件。

這不是你所需要的。您可能應該保持某種應用程序狀態keyIsPressed,只有在第一次關閉(未按下)鍵時纔會更改該狀態。然後只在鑰匙啓動時關閉此變量。當第一次關機時,開始後臺線程移動你的對象並定期檢查標誌keyIsPressed以知道何時停止。

好運,成爲馬里奧的競爭對手... :)

0
  • 如果這是一個Swing GUI,然後使用鍵綁定,而不是一個按鍵偵聽器,
  • 開始按鍵一個Swing計時器
  • 並停止在密鑰發佈。
0

所有KeyEvent都是整數,因此您可以創建布爾型[]來存儲KeyEvent中的所有更改。對於Java2D我使用這樣的事情:

import java.awt.KeyEventDispatcher; 
import java.awt.event.KeyEvent; 

public final class Keyboard implements KeyEventDispatcher { 

    public static boolean[] keyPressed = new boolean[256]; 
    public static boolean[] keyHold = new boolean[256]; 
    public static boolean[] keyReleased = new boolean[256]; 

    public static void update() { 
     for (int i=0; i<128; i++) { 
      keyPressed[i] = false; 
      keyReleased[i] = false; 
     } 
    } 

    public boolean dispatchKeyEvent(KeyEvent e) { 
     if (e.getID()==KeyEvent.KEY_PRESSED) { 
      keyHold[e.getKeyCode()] = true; 
      keyPressed[e.getKeyCode()] = true; 
     } 
     else if (e.getID()==KeyEvent.KEY_RELEASED) { 
      keyHold[e.getKeyCode()] = false; 
      keyReleased[e.getKeyCode()] = true; 
     } 
     return false; 
    } 

} 

我在每幀後調用update()。