我正在用Java开发一个小的2D游戏引擎,在Ubuntu托管的VirtualBox VM中玩我的演示游戏之后,我发现了一个奇怪的错误,有时会导致游戏忽略按下键的事实。所以你向左跑直到你突然停止移动。
现在,在一个真正的Ubuntu下,我找到了问题的原因。当我按住键时,keyPress/keyRelease事件就一直在发送。
我的系统检查按下的键如下:
现在,当您按下第二个键时,有时keyRelease是由另一个键触发的最后一个事件,该事件仍然保持,但无法以这种方式识别。
有什么办法解决这个问题吗?这真的很烦人。
编辑
为了澄清,这是我连续按住一个键时得到的结果:
按: 87
释放: 87人
释放: 87人
按: 87
释放: 87人
按: 87
释放: 87人
按: 87
释放: 87人
等。
EDIT2
好的,在搜索了更多之后,我发现这是X11服务器的一个“特性”,但我仍然不知道如何在java中检测“假”键事件。
发布于 2010-02-10 23:57:21
好吧..。我“修好”了。
由于X11不断触发它的自动重复键事件,所以无法以忽略那些“假”事件的方式改变整个事件,您无法区分Java中的“真”事件和“假”事件。
因此,解决这个问题的方法如下。由于每个“假”keyUp事件后面都跟着一个立即keyDown事件,所以如果收到keyDown事件,只需从keyRemoveList中删除keyUp事件,如下所示:
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之间。
发布于 2010-02-10 21:13:29
您可能会遇到一些冲突,因为您正在解决按键的每一个帧和切换之间的列表。如果您计划按下的每个键都有一个布尔值(如右箭头、左arrow...etc),则可能会更清晰一些。按下键时,将相应的布尔值设置为true,然后在释放时将其设置为false。这是处理电子游戏中键盘控制的一种非常常见的方法。
发布于 2010-02-11 01:14:14
当然,自动重复在X11中是可配置的。只需查看xset命令选项r或-r即可。可以禁用某些密钥代码的自动重复。
$ xset -r keycodehttps://stackoverflow.com/questions/2240190
复制相似问题