我正在用 Java 制作 2D 游戏,我使用 KeyListener 和一些布尔值来检测按键。但问题是,当我按住一个键时,玩家半秒钟不会移动,然后开始移动。有谁知道如何解决这一问题?
public void keyPressed(...) { PlayerX += 3; 任何答案将不胜感激谢谢。
我正在用 Java 制作 2D 游戏,我使用 KeyListener 和一些布尔值来检测按键。但问题是,当我按住一个键时,玩家半秒钟不会移动,然后开始移动。有谁知道如何解决这一问题?
public void keyPressed(...) { PlayerX += 3; 任何答案将不胜感激谢谢。
有多种方法可以处理 Java 中的游戏控件,但我更喜欢的方法包括一个名为.. 的类。让我们说“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];
}
现在这个类将为我们处理所有的 keyBindings,并且假设您为 Canvas 添加KeyListener 或您的游戏在其上运行的任何东西都将起作用并相应地更改 Key.up/down/left/right/special。
现在最后一步是实现所有这些以有效且轻松地移动我们的角色。
假设您在游戏中的实体具有 update() 方法,这些方法运行每个刻度或类似的东西.. 我们现在可以简单地添加到它
if(Key.up.isDown) y+=3;
或者在您的情况下,我们可以将其放入主类并以与游戏滴答循环中相同的方式进行操作。
if(Key.right.isDown) PlayerX += 3;
这听起来像是操作系统中按键的重复(自动重复)的正常行为。只需尝试在任何文本编辑器中按住一个键,您就会注意到在显示的第一个字符和下一个字符之间有很短的时间。在 Windows 上这是 500 毫秒,在其他平台上不确定。