KeyStroke和KeyListener无效

时间:2018-07-10 21:45:21

标签: java swing keyboard

我正在尝试制作一个可以使用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 个答案:

没有答案