我为KeyListener中的一个非常简单的游戏编写控件。我遇到了以下问题。
我做了类似的事情(只有简单示例而不是我实现的代码):
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_LEFT) {
leftPressed = true;
Methodxyz(leftpressed,rightpressed,uppressed)
}
if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
rightPressed = true;
Methodxyz(leftpressed,rightpressed,uppressed)
}
if (e.getKeyCode() == KeyEvent.VK_UP) {
upPressed = true;
Methodxyz(leftpressed,rightpressed,uppressed)
}
}
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_LEFT) {
leftPressed = false;
}
if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
rightPressed = false;
}
if (e.getKeyCode() == KeyEvent.VK_UP) {
upPressed = false;
}
}
如果我同时按下2个键(左,上)你可以移动charachter对角线。问题是监听器适用于上次按下的KeyEvent ,所以如果我按左然后向上,但没有释放 左和释放,对象不会移动(左按下)。
我该如何处理? 是否可以在我的keylistener的keypressed方法中触发按键事件,直到leftpressed为false?
有什么想法吗?
提前致谢
答案 0 :(得分:0)
我不清楚你的问题。我想你可以通过来自切换键的事件使用Methodxyz()方法更改某些内容的位置。可能你应该像现在一样设置和重置标志,但是在单独的线程中完成移动(在这种情况下,移动速度将不依赖于事件生成速度,这可能是不同的)。你会有类似的东西:
public void run() {
while(!endOfGame) {
//calculate new position based on flags and move.
Thread.sleep(50); //or something more precise based on timers.
}
}
答案 1 :(得分:0)
不要在按键方法中调用移动方法,相反,每当你在游戏循环中调用更新时,也会在inputlistener中调用一个更新方法来检查已按下哪些键,这样你就可以拥有多个按键。同时,一旦释放密钥将被设置为假的按键,如下所示:
在你的输入处理程序中:
public void update() {
if (up == true) {
SomeMethod(Key.UP);
}
if (down == true) {
SomeMethod(Key.DOWN);
}
if (left == true) {
someMethod(Key.LEFT);
}
if (right == true) {
someMethod(Key.RIGHT);
}
}
public void keyReleased(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_S:
down = false;
break;
case KeyEvent.VK_W:
up = false;
break;
case KeyEvent.VK_A:
left = false;
break;
case KeyEvent.VK_D:
right = false;
break;
}
}
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_S:
down = true;
break;
case KeyEvent.VK_W:
up = true;
break;
case KeyEvent.VK_A:
left = true;
break;
case KeyEvent.VK_D:
right = true;
break;