Java-KeyListener多按钮按下
我希望我能用正确的方式描述我的问题。我现在正在编写一个简单的双杆射击程序,所以我实现了一个实现KeyListener的KeyInPurthandler calss。但当播放器同时按下两个按钮时,我遇到了一个问题。球员真正移动总是需要一秒钟的时间。据我所知,这是因为关键的重复。我可能错了。我在谷歌上搜索了一下,在这里找到了一个可能的解决方案: 人们建议不要在按键时改变玩家的x和y速度,而是在玩家按下某个按钮时标记方向,并用不同的方法处理移动。因此,我创建了布尔变量,并在按下按钮时激活它们:Java-KeyListener多按钮按下,java,awt,2d,controls,keylistener,Java,Awt,2d,Controls,Keylistener,我希望我能用正确的方式描述我的问题。我现在正在编写一个简单的双杆射击程序,所以我实现了一个实现KeyListener的KeyInPurthandler calss。但当播放器同时按下两个按钮时,我遇到了一个问题。球员真正移动总是需要一秒钟的时间。据我所知,这是因为关键的重复。我可能错了。我在谷歌上搜索了一下,在这里找到了一个可能的解决方案: 人们建议不要在按键时改变玩家的x和y速度,而是在玩家按下某个按钮时标记方向,并用不同的方法处理移动。因此,我创建了布尔变量,并在按下按钮时激活它们: pub
public class KeyInputHandler implements KeyListener{
private Game game;
// checks if A key is down
public boolean left_key_down = false;
// checks if D key is down
public boolean right_key_down = false;
// checks if W key is down
public boolean up_key_down = false;
// checks if S key is down
public boolean down_key_down = false;
public KeyInputHandler(Game game) {
this.game = game;
}
public void keyPressed(KeyEvent e) {
int keys = e.getKeyCode();
if (keys == KeyEvent.VK_D) {
right_key_down = true;
} else if (keys == KeyEvent.VK_A) {
left_key_down = true;
} else if (keys == KeyEvent.VK_W) {
up_key_down = true;
} else if (keys == KeyEvent.VK_S) {
down_key_down = true;
}
}
public void keyReleased(KeyEvent e) {
int keys = e.getKeyCode();
if (keys == KeyEvent.VK_D) {
right_key_down = false;
} else if (keys == KeyEvent.VK_A) {
left_key_down = false;
} else if (keys == KeyEvent.VK_W) {
up_key_down = false;
} else if (keys == KeyEvent.VK_S) {
down_key_down = false;
}
}
public void keyTyped(KeyEvent e) {
}
public void tick() {
if (left_key_down) {
game.p.setVelX(-1);
} else if (right_key_down) {
game.p.setVelX(1);
} else if (up_key_down) {
game.p.setVelY(-1);
} else if (down_key_down) {
game.p.setVelY(1);
} else {
game.p.setVelY(0);
game.p.setVelX(0);
}
}
}
(在主游戏循环中调用tick()方法)
现在的问题是不再有延迟(耶),但当我同时按下两个按钮时,事情变得很奇怪。例如:
这有点奇怪,我真的不知道如何处理,到底是什么导致了这种行为。我假设这与检查冷却器的顺序有关。也许有人能在这件事上帮我。我将不胜感激 在同时按下多个键时,事情变得奇怪的原因是,您正在使用if-else检查布尔值。分离tick()中的所有布尔检查以拥有单个ifs。如果不断按下任何一个按钮,代码将不会进入最后一个else块,在该块中,VelX和VelY将重置为零 将tick方法中的代码更改为如下内容:
//Set 'velocity' to zero first
game.p.setVelY(0);
game.p.setVelX(0);
if (left_key_down) {
game.p.setVelX(-1);
}
if (right_key_down) {
game.p.setVelX(1);
}
if (up_key_down) {
game.p.setVelY(-1);
}
if (down_key_down) {
game.p.setVelY(1);
}
工作起来很有魅力。是的,如果问题出在其他地方。我没有意识到这一点。谢谢:)