首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux/X11下的Java keyPress/keyRelease问题

Linux/X11下的Java keyPress/keyRelease问题
EN

Stack Overflow用户
提问于 2010-02-10 20:40:36
回答 3查看 2.4K关注 0票数 1

我正在用Java开发一个小的2D游戏引擎,在Ubuntu托管的VirtualBox VM中玩我的演示游戏之后,我发现了一个奇怪的错误,有时会导致游戏忽略按下键的事实。所以你向左跑直到你突然停止移动。

现在,在一个真正的Ubuntu下,我找到了问题的原因。当我按住键时,keyPress/keyRelease事件就一直在发送。

我的系统检查按下的键如下:

  • 如果按下键,将其添加到“下拉列表”中。
  • 如果释放了密钥,则将其添加到上行节点。
  • 在游戏的每一帧上,从下拉列表中移除向上的键。
  • 如果键仍在下单中,则按下

现在,当您按下第二个键时,有时keyRelease是由另一个键触发的最后一个事件,该事件仍然保持,但无法以这种方式识别。

有什么办法解决这个问题吗?这真的很烦人。

编辑

为了澄清,这是我连续按住一个键时得到的结果:

按: 87

释放: 87人

释放: 87人

按: 87

释放: 87人

按: 87

释放: 87人

按: 87

释放: 87人

等。

EDIT2

好的,在搜索了更多之后,我发现这是X11服务器的一个“特性”,但我仍然不知道如何在java中检测“假”键事件。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-02-10 23:57:21

好吧..。我“修好”了。

由于X11不断触发它的自动重复键事件,所以无法以忽略那些“假”事件的方式改变整个事件,您无法区分Java中的“真”事件和“假”事件。

因此,解决这个问题的方法如下。由于每个“假”keyUp事件后面都跟着一个立即keyDown事件,所以如果收到keyDown事件,只需从keyRemoveList中删除keyUp事件,如下所示:

代码语言:javascript
复制
public final void keyPressed(final KeyEvent e) {
    int key = e.getKeyCode();

    // Fix AutoKeyRepeat under X11
    if (keysRemove.contains(key)) {
        keysRemove.remove(Integer.valueOf(key));
    }

    if (!keysDown.contains(key)) {
        keysDown.add(key);
        keysPressed.add(key);
        lastKeys.add(key);
        if (lastKeys.size() > 16) {
            lastKeys.remove(0);
        }
    }
    e.consume();
}

因为“真正的”keyUp事件之后没有直接的keyDown事件,所以它通常会被处理。从理论上讲,游戏框架不可能出现在“假”keyUp和keyDown之间。

票数 1
EN

Stack Overflow用户

发布于 2010-02-10 21:13:29

您可能会遇到一些冲突,因为您正在解决按键的每一个帧和切换之间的列表。如果您计划按下的每个键都有一个布尔值(如右箭头、左arrow...etc),则可能会更清晰一些。按下键时,将相应的布尔值设置为true,然后在释放时将其设置为false。这是处理电子游戏中键盘控制的一种非常常见的方法。

票数 1
EN

Stack Overflow用户

发布于 2010-02-11 01:14:14

当然,自动重复在X11中是可配置的。只需查看xset命令选项r-r即可。可以禁用某些密钥代码的自动重复。

代码语言:javascript
复制
$ xset -r keycode
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2240190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档