所以我正在用Java做游戏,而我目前正在使用键盘输入。我有一个称为KeyboardManager
的keylistener类设置,其中有一个静态函数,用于检测是否按住了某个键。这是该类的代码:
public class KeyboardManager implements KeyListener {
public static Map<Integer, Boolean> keys;
public KeyboardManager () {
keys = new HashMap<>();
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
keys.put(e.getKeyCode(), true);
}
@Override
public void keyReleased(KeyEvent e) {
keys.put(e.getKeyCode(), false);
}
public static boolean isKeyDown(int key) {
if (!keys.containsKey(key)) return false;
return keys.get(key);
}
}
isKeyDown
函数可以很好地工作,我可以用它来移动玩家,但是,如果像想象中的那样,用它来打开gui(如玩家清单),它就会打开和关闭每个刻度。我正在寻找一种方法来完成现在的工作,但是使用keyTyped
而不是keyPressed
和keyReleased
。显然,这里的挑战是没有办法知道键类型何时结束。例如,在Unity中,当您使用c#进行编码时,可以执行类似Input.GetKeyDown("E")
的操作,它将测试密钥类型,而Input.GetKey("E")
将检测其是否被按下。任何帮助将不胜感激。
答案 0 :(得分:1)
keyTyped
在释放键时被触发,因此您可以将事件响应添加到事件处理函数本身中,而不用检查其他地方是否按下了键:
@Override
public void keyTyped(KeyEvent e) {
int code = e.getKeyCode();
if (code == KeyEvent.VK_I) {
if (!isInventoryOpen) {
openInventory();
} else {
closeInventory();
}
} else if (code == KeyEvent.VK_M) {
// ...
} // else if ...
}
如果您有一组复杂的交互,则可以为每个操作创建一个具有唯一子类的抽象类,其中包含适用的键代码和要执行的操作。然后,您可以存储keyTyped
中要使用的所有操作的列表或映射,并使用事件的键代码来查找具有该键代码的操作。
答案 1 :(得分:0)
在我正在处理的项目中,我的关键侦听器与某些可见的面板相关联。 (相同的键具有类似操作的变体,例如KeyEvent.VK_ENTER
用于提交)
您也许可以实现一个中间人标志,即在按下该键时可以切换的标志,而在可以再次按下/注册该键时可以切换回的标志。
此链接java keylistener not called对我来说非常有用,因为我也需要keyBindings(TextField和JPanel侦听器)