Java KeyPressed - 如果其他键也被

时间:2016-12-17 18:35:57

标签: java keylistener

正如标题所示,在我的Java游戏中,我无法检测到我是否同时按下空格键和其他键。

例如,空格键是拍摄键,箭头键使玩家移动。如果我按向上箭头键和左箭头键以及空格键,那么它应向上射击子弹并向左。

然而,在使用多个System.out.println();进行调试之后,我发现如果我按下两个键,如果按下它就不会检测空格键。

public void keyPressed(KeyEvent e) {


if(e.getKeyCode() == 32){
    pressingSpacebar = true;
    System.out.println("Spacebar pressed true");
}


    // Up arrow key
    if(e.getKeyCode() == 38){
        up = true;
        System.out.println("Up = true");
    }
    // Down arrow key
    if(e.getKeyCode() == 40){
        down = true;
        System.out.println("Down = true");

    }
    // Right arrow key
    if(e.getKeyCode() == 39){
        right = true;
        System.out.println("Right = true");
    }
    // Left arrow key
    if(e.getKeyCode() == 37){
        left = true;
        System.out.println("Left = true");
    }
}

然后在keyReleased:

public void keyReleased(KeyEvent e) {
    if(e.getKeyCode() == 38){
        up = false;
        repaint();
    }
    if(e.getKeyCode() == 40){
        down = false;
        repaint();
    }
    if(e.getKeyCode() == 39){
        right = false;
        repaint();
    }
    if(e.getKeyCode() == 37){
        left = false;
        repaint();
    }
    if(e.getKeyCode() == 32){
        pressingSpacebar = false;
    }
}

我正在检查您是否按空格键和多个键:

if(pressingSpacebar){
        if(right == true && down == true && up == false && left == false){
            // Shoot bullet
        }
}   

为什么没有检测到空格键?如果我没有检查空格键是否被按下,子弹射击很好,但是当我检查空格键时它只是没有检测到它。

注意:我已阅读与此问题类似的其他帖子,但答案并不是很有帮助。对于这些东西,我是一个新手,所以尽量给出一个简单的答案或解释一下。提前谢谢!

3 个答案:

答案 0 :(得分:1)

KeyEvent仅为按下的最后一个键生成,因此您需要在按下键时跟踪键(例如通过将其添加到HashMap)然后在键释放时需要从键中删除键。 HashMap中。

更好的方法是使用Key Bindings(而不是KeyListener)将KeyStroke绑定到Action

查看Motion Using the Keyboard中的KeyboardAnimation示例。它解释了有关键绑定的更多信息,并提供了处理向上/向下/向右/向左键的完整工作示例。通常,可以同时按下任意两个键以进行对角线运动。

逻辑也适用于3个键,但正如已经提到的那样,键盘本身可能不支持同时按下那么多键。

答案 1 :(得分:0)

我遇到过类似的问题。我发现无法保证同时按下按键并按住它们会为每个按键多次触发按键事件。所以,如果你依赖它,你需要牢记这一点。

答案 2 :(得分:-1)

我认为你应该在一个单独的构造中尝试所有条件。

试一试 -

if(pressingSpacebar && right && down && !up && !left){
            // Shoot bullet
}