0

我正在用 Java 制作 2D 游戏,我使用 KeyListener 和一些布尔值来检测按键。但问题是,当我按住一个键时,玩家半秒钟不会移动,然后开始移动。有谁知道如何解决这一问题?

public void keyPressed(...) { PlayerX += 3; 任何答案将不胜感激谢谢。

4

2 回答 2

2

有多种方法可以处理 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;
于 2012-09-16T16:09:16.000 回答
1

这听起来像是操作系统中按键的重复(自动重复)的正常行为。只需尝试在任何文本编辑器中按住一个键,您就会注意到在显示的第一个字符和下一个字符之间有很短的时间。在 Windows 上这是 500 毫秒,在其他平台上不确定。

于 2012-09-16T16:09:30.287 回答