我正在用java开发一个小型的2d游戏引擎,在一个托管ubuntu的virtualbox vm中玩完我的演示游戏后,我发现了一个奇怪的错误,有时会导致游戏忽略按键的事实。所以你往左边跑,直到你突然停止移动。
现在在一个真正的ubuntu下我找到了问题的原因。当我按住一个键时,按键/按键释放事件将一直发送。
我的按键检查系统如下:
-如果按下某个键,则将其添加到“下行列表”
-如果释放了钥匙,将其添加到上排
-在游戏的每一帧中,从下行链路中移除上行链路中的键
-如果某个键仍在下行链路中,则按下该键
现在,当您按下第二个键时,有时keyrelease是另一个键触发的最后一个事件,该键仍然保持,但无法以这种方式识别。
有什么办法解决这个问题吗?真烦人。
编辑
为了澄清这一点,我连续按住一个键时得到的结果是:
按:87
发布时间:87
发布时间:87
按:87
发布时间:87
按:87
发布时间:87
按:87
发布时间:87
等。
编辑2
好吧,在google上搜索了更多之后,我发现这是x11服务器的一个“特性”,但是我仍然不知道如何检测java中的“假”键事件。
最佳答案
您可能会遇到一些冲突,因为您解决每帧按键和在列表之间切换的方式。对于您计划按的每个键(如右箭头、左箭头…等),使用布尔值可能会更简洁一些。当按下某个键时,将对应的布尔值设置为true,然后在释放时将其设置为false。这是在电子游戏中处理键盘控制的一种非常常见的方法