因此,我正在用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")
会检测它是否被按下。任何帮助,将不胜感激。 最佳答案
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
中使用的所有操作的列表或映射,并使用事件的键代码找到具有该键代码的操作。