有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java击键和KeyListener将无法工作

我正在尝试制作一个游戏,在游戏中使用WASD键移动,起初我尝试在JFrame上使用一个KeyListener,但它随机停止。然后我发现this solution,这似乎纠正了我的问题,但经过调整后,它仍然会随机停止工作

这是我两次尝试的代码

第一次尝试:

private class GameKeyListener implements KeyListener{

    @Override
    public void keyTyped(KeyEvent e) {}

    @Override
    public void keyPressed(KeyEvent e) {
        System.out.println("Pressed " + e.getKeyChar());
        switch(e.getKeyChar()) {
        case 'w':
            goUp = true;
            break;
        case 'a':
            goLeft = true;
            break;
        case 's':
            goDown = true;
            break;
        case 'd':
            goRight = true;
            break;
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
        switch(e.getKeyChar()) {
        case 'w':
            goUp = false;
            break;
        case 'a':
            goLeft = false;
            break;
        case 's':
            goDown = false;
            break;
        case 'd':
            goRight = false;
            break;
        }
    }

}

第二次尝试:

        ...
        KeyStroke[] pressed = new KeyStroke[]{
            KeyStroke.getKeyStroke(KeyEvent.VK_W, 0, false),
            KeyStroke.getKeyStroke(KeyEvent.VK_A, 0, false),
            KeyStroke.getKeyStroke(KeyEvent.VK_S, 0, false),
            KeyStroke.getKeyStroke(KeyEvent.VK_D, 0, false)
    };
    KeyStroke[] released = new KeyStroke[]{
            KeyStroke.getKeyStroke(KeyEvent.VK_W, 0, true),
            KeyStroke.getKeyStroke(KeyEvent.VK_A, 0, true),
            KeyStroke.getKeyStroke(KeyEvent.VK_S, 0, true),
            KeyStroke.getKeyStroke(KeyEvent.VK_D, 0, true)
    };
    InputMap inputMap = panel.getInputMap(JPanel.WHEN_IN_FOCUSED_WINDOW);
    ActionMap actionMap = panel.getActionMap();

    for(KeyStroke k : pressed) {
        String key = "p" + k.getKeyCode();
        inputMap.put(k, key);
        actionMap.put(key, new UpAction(false, k.getKeyCode()));
    }
    for(KeyStroke k : released) {
        String key = "r" + k.getKeyCode();
        inputMap.put(k, key);
        actionMap.put(key, new UpAction(true, k.getKeyCode()));
    }
}

private class UpAction extends AbstractAction {
    private static final long serialVersionUID = -110890480129966855L;
    private boolean onKeyRelease;
    private int key;
    public UpAction(boolean onKeyRelease, int key) {
        this.onKeyRelease = onKeyRelease;
        this.key = key;
    }

    @Override
    public void actionPerformed(ActionEvent evt) {
        System.out.print(onKeyRelease + "/" + key);
        switch(key) {
        case KeyEvent.VK_W:
            goUp = !onKeyRelease;
            break;
        case KeyEvent.VK_A:
            goLeft = !onKeyRelease;
            break;
        case KeyEvent.VK_S:
            goDown = !onKeyRelease;
            break;
        case KeyEvent.VK_D:
            goRight = !onKeyRelease;
            break;
        }
    }
}

共 (0) 个答案