【问题标题】:Java KeyPressed - Can't Detect If Spacebar is Being Pressed If Other Keys Are TooJava KeyPressed - 如果其他键也按下,则无法检测是否按下空格键
【发布时间】:2017-05-03 06:42:46
【问题描述】:

正如标题所示,在我的 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
        }
}   

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

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

【问题讨论】:

  • GoldenBolt 是对的,这是复制品。如果您有两个 KeyPressed 事件而没有 KeyReleased 事件,则同时按下两个键。
  • 您测试过键盘本身吗?尽管按下了多个键,但一些低端键盘将仅输出一个键码。如果您不知道是否会出现这种情况,我建议您先检查一下。
  • @walen 是的,我刚刚看到了,我会尝试一下并告诉你。

标签: java keylistener


【解决方案1】:

KeyEvent 仅针对最后一次按下的键生成,因此您需要在按下键时跟踪它(例如通过将其添加到 HashMap),然后在 keyReleased 上您需要从哈希映射。

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

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

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

【讨论】:

  • 我会在我在家的时候检查一下,但我最近在另一个网站上看到了一个与完全相同问题的帖子。他们可以按向左和空格键,这很好,但是像向右和空格键这样的东西不起作用。显然他发现他的键盘有问题。会是这样吗?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我认为您应该在一个构造本身中尝试所有条件。

    试试看-

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

    【讨论】:

    • 不幸的是我有同样的结果。但是我会这样做,因为它看起来更干净。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    相关资源
    最近更新 更多