因此,我正在用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而不是keyPressedkeyReleased。显然,这里的挑战是没有办法知道键类型何时结束。例如,在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中使用的所有操作的列表或映射,并使用事件的键代码找到具有该键代码的操作。

10-04 19:50