2012-09-16 40 views
0

我在Java中製作2D遊戲,我使用KeyListener和一些布爾值來檢測按鍵。但問題是,當我按住一個鍵時,玩家不會移動半秒鐘,然後開始移動。有誰知道如何解決這一問題?Java - 將控件添加到遊戲的最佳方式

public void keyPressed(...) { PlayerX + = 3; } 任何答案,將不勝感激謝謝。

+0

請發佈相關代碼/項目信息。 – moonwave99

+1

您是否嘗試在單獨的線程中分離動畫和鍵盤輸入代碼? –

+0

@HernanVelasquez不,我沒有,但這並不是問題 – Ewen

回答

2

有多種方式來處理控件的Java遊戲,但我prefereble方式將包括一個名爲類..可以說「Key.class」

裏面Key.class我們可以有:

public class Key{ 
    // Creating the keys as simply variables 
    public static Key up = new Key(); 
    public static Key down = new Key(); 
    public static Key left = new Key(); 
    public static Key special = new Key(); 

    /* toggles the keys current state*/ 
    public void toggle(){ 
     isDown = !isDown; 
    } 

    public boolean isDown; 
} 

現在我們有一個類,如果某些按鍵被按下,我們可以訪問,但首先我們需要確保按鍵的.isDown函數將被正確切換。我們在實現KeyListener的類中執行此操作。

比方說,我們有「Controller.class」

package game; 
// Importing the needed packages 
import java.awt.event.FocusEvent; 
import java.awt.event.FocusListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 
import java.util.HashMap; 

public class Controller implements KeyListener{ 
//Assigning the variable keys to actual letters 
public Controller(Main main){ 
    bind(KeyEvent.VK_W, Key.up); 
    bind(KeyEvent.VK_A, Key.left); 
    bind(KeyEvent.VK_S, Key.down); 
    bind(KeyEvent.VK_D, Key.right); 
    bind(KeyEvent.VK_SPACE, Key.special); 
    mainClass = main; 
} 

@Override 
public void keyPressed(KeyEvent e) { 
    other[e.getExtendedKeyCode()] = true; 
    keyBindings.get(e.getKeyCode()).isDown = true; 
} 

@Override 
public void keyReleased(KeyEvent e) { 
    other[e.getExtendedKeyCode()] = false; 
    keyBindings.get(e.getKeyCode()).isDown = false; 
} 

public boolean isKeyBinded(int extendedKey){ 
    return keyBindings.containsKey(extendedKey); 
} 

@Override 
public void keyTyped(KeyEvent e) { 
} 


public void bind(Integer keyCode, Key key){ 
    keyBindings.put(keyCode, key); 
} 

public void releaseAll(){ 
    for(Key key : keyBindings.values()){ 
     key.isDown = false; 
    } 
} 

public HashMap<Integer, Key> keyBindings = new HashMap<Integer, Key>(); 
public static boolean other[] = new boolean[256]; 

}

現在,這個類將處理所有我們的鍵綁定的我們,並假設你addKeyListener的帆布或任何你的遊戲運行在它上面將會起作用並相應地改變Key.up/down/left/right/special。

現在最後一步是實現所有這些,以便高效和輕鬆地移動角色。

假設你的實體在遊戲中具有運行每刻度或類似的update()方法。我們現在可以簡單的添加進去

if(Key.up.isDown) y+=3; 

或在您的情況下,我們可以把它變成主類和只要在遊戲循環中進行同樣的操作。

if(Key.right.isDown) PlayerX += 3; 
1

這聽起來像是在您的操作系統中按鍵重複(自動重複)的正常行爲。只要在任何文本編輯器中按住一個鍵,你就會注意到在顯示的第一個字符和下一個字符之間有一小段時間。在Windows上,這是500毫秒,在其他平臺上無法確定。

相關問題