我一直在创建一个测试程序来测试一个角度的移动可能如何工作,即使这不是我的问题所在,也是我的问题/困惑所在的程序。这个错误(?)不会影响我的程序的工作方式,除非用户想要键入每个键的混搭,看看会发生什么,这正是我所做的......
我有一个按键监听器,在每次按键和按键释放时,在数组中设置一个布尔值:
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
int a = KeyEvent.VK_LEFT; // int value of 37
int b = KeyEvent.VK_UP; // 38
int c = KeyEvent.VK_RIGHT; // 39
int d = KeyEvent.VK_DOWN; // 40
int aa = KeyEvent.VK_G; // 71
int bb = KeyEvent.VK_H; // 72
if(key == a || key == b || key == c || key == d) {
player.setKeyValue(key - 37, true); // keyReleased is exactly the same but with a false
}
if(key == aa || key == bb) {
player.setKeyValue((key - 71) + 4, true);
}
}
我让我的面板绘制了哪些按键被按下了,我注意到并非我按下的所有按键都被画到屏幕上。我很困惑,认为它与缓冲图像太小有关,所以我仔细检查了一下,奇怪的是它没有。我决定将阵列中的所有布尔值打印到控制台,我发现实际上,实际上有些键实际上并没有被按下。
以下是我在按下不同键时收到的一些输出:
// booleans are in order: Left, up, right, down, g, h
true, false, true, false, false, true
true, false, true, false, true, true
true, false, true, false, false, false
我不确定为什么会这样,但我觉得它与JVM在给定时间可以容纳的内存量有关。
虽然这对我来说没有任何障碍,但知道这种情况发生的原因和原因会很好吗?
答案 0 :(得分:5)
我严重怀疑它与JVM在给定时间可以容纳的内存量有什么关系。
很难说最好的方法是做你想做的事。
考虑类似的事情:
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
int keyIndex = -1;
switch(key)
{
case KeyEvent.VK_LEFT: keyIndex = 0; break;
case KeyEvent.VK_UP: keyIndex = 1; break;
case KeyEvent.VK_RIGHT: keyIndex = 2; break;
case KeyEvent.VK_DOWN: keyIndex = 3; break;
case KeyEvent.VK_G: keyIndex = 4; break;
case KeyEvent.VK_H: keyIndex = 5; break;
default:
System.out.format("Unexpected KeyCode [%d]\n", key);
break;
}
if(keyIndex != -1){ player.setKeyValue(keyIndex, true); }
}
这种方法摆脱了很多困难,并且如果你得到意想不到的钥匙,也会尝试通知你。不知道更多,很难给你一个更好的答案,但我提出的那个肯定不是最好的 - 它只是调试的一个步骤。我的猜测类似于KeyEvents或整数的ArrayList(对应于KeyCodes)可能是更好的选择。
你可以编辑它以总是显示密钥代码,这样你就可以立即看到生成了什么密钥代码。