我在Java中製作2D遊戲,我使用KeyListener和一些布爾值來檢測按鍵。但問題是,當我按住一個鍵時,玩家不會移動半秒鐘,然後開始移動。有誰知道如何解決這一問題?Java - 將控件添加到遊戲的最佳方式
public void keyPressed(...) { PlayerX + = 3; } 任何答案,將不勝感激謝謝。
我在Java中製作2D遊戲,我使用KeyListener和一些布爾值來檢測按鍵。但問題是,當我按住一個鍵時,玩家不會移動半秒鐘,然後開始移動。有誰知道如何解決這一問題?Java - 將控件添加到遊戲的最佳方式
public void keyPressed(...) { PlayerX + = 3; } 任何答案,將不勝感激謝謝。
有多種方式來處理控件的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;
這聽起來像是在您的操作系統中按鍵重複(自動重複)的正常行爲。只要在任何文本編輯器中按住一個鍵,你就會注意到在顯示的第一個字符和下一個字符之間有一小段時間。在Windows上,這是500毫秒,在其他平臺上無法確定。
請發佈相關代碼/項目信息。 – moonwave99
您是否嘗試在單獨的線程中分離動畫和鍵盤輸入代碼? –
@HernanVelasquez不,我沒有,但這並不是問題 – Ewen