0

所以我有一个keyListener,我终于克服了键盘输入延迟。我现在有一个新问题,当用户按下“UP”箭头键移动“UP”时,他们移动“UP”只要他们想要的时间,然后当用户按下“DOWN”箭头键时,(同时仍然按住“UP”箭头键)他们移动“DOWN”。

如何让他们在释放“向下”箭头键后再次移动“向上”,而不必再次按“向上”键?

(注意:在整个过程中按“UP”键。)

这是我目前用于监听输入的代码。

private void keyListeners(){
    GlobalObjects.frame.addKeyListener(new KeyListener() {
        @Override
        public void keyPressed(KeyEvent e) {

            //Up    = 1
            //Down  = 2
            //Left  = 3
            //Right = 4

            if(e.getKeyCode() == 38){
                System.out.println("UP KEY PRESSED");
                player.setPlayerMovement(1);
            }else if(e.getKeyCode() == 40){
                System.out.println("DOWN KEY PRESSED");
                player.setPlayerMovement(2);
            }else if(e.getKeyCode() == 37){
                player.setPlayerMovement(3);
            }else if(e.getKeyCode() == 39){
                player.setPlayerMovement(4);
            }

        }

        @Override
        public void keyReleased(KeyEvent e) {
            if(e.getKeyCode() == 38){
                if(player.getPlayerMovement() != 1){
                    System.out.println("UP KEY released, but some other arrow key changed the playermovement to a different number (do nothing)");
                }else{
                    System.out.println("UP Key was a the last key pressed, therefore its safe to set player movement to "0" (not moving)");
                    player.setPlayerMovement(0);
                }
            }else if(e.getKeyCode() == 40){
                if(player.getPlayerMovement() != 2){

                }else{
                    player.setPlayerMovement(0);
                }
            }else if(e.getKeyCode() == 37){
                if(player.getPlayerMovement() != 3){

                }else{
                    player.setPlayerMovement(0);
                }
            }else if(e.getKeyCode() == 39){
                if(player.getPlayerMovement() != 4){

                }else{
                    player.setPlayerMovement(0);
                }
            }
        }

        @Override
        public void keyTyped(KeyEvent e) {

        }
    });
}

如果您看不出来,这是一款基于 2D 角色扮演游戏的游戏。(如果这有帮助,请回答问题)

4

1 回答 1

0

我在这里找到了类似的问题,它应该可以解决您的问题。根据Oracle官方按键事件演示here当你按住一个键,按下另一个键然后释放第二个键,只会生成第二个键的释放事件。我不知道为什么,但就是这样。您将必须记住每个按下的键并为最轻的按下一个键提供响应。

编辑:我注意到这不是 JAVA 问题(至少,不仅仅是)。根据KeyEvent的文档,KeyPressed并且KeyReleased是低级方法:

“按键”和“按键释放”事件是较低级别的,取决于平台和键盘布局。

所以这种行为可能是平台相关的。我的好奇心让我在“运行”提示符下尝试这个动作(是的,我正在 Windows 上工作),猜猜发生了什么——同样的事情!不仅适用于箭头,也适用于字母。当我按住例如。's' 比按下并释放 'k',同时按住 's' 我得到以 'k' 结尾的文本字段输入sskkkkkkkkkkkk

于 2013-09-04T07:47:36.393 回答