我希望我能以正确的方式描述我的问题。我正在编写一个简单的双棒射击游戏,所以我实现了一个实现KeyListener的KeyInputHandler calss。但是当玩家同时按下2个按钮时我遇到了问题。在玩家实际移动之前总是需要一秒钟。据我所知,这是因为关键重复。我可能错了。我google了一下,在这里找到了一个可能的解决方案: https://gamedev.stackexchange.com/questions/51623/smoother-controls?rq=1 人们建议不要在按键时改变玩家的x和y速度,而是在玩家按下某个按钮并以不同的方法处理移动时标记方向。所以我创建了布尔变量并在按下按钮时激活它们:
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()方法)
现在的问题是没有延迟(yay),但是当我按下2个按钮时,事情会变得奇怪。例如:
但是当我按住Right然后als按住它时它就会向下移动。
我还检查了布尔变量,它们正在正确刷新。 这有点奇怪,我不确定如何处理这个以及究竟是什么导致了这种行为。我假设它与检查冷却的顺序有关。也许某人可以帮我解决这个问题。我将不胜感激。 :)
答案 0 :(得分:2)
在一起按下多个按键时,事情变得奇怪的问题是你正在使用if else来检查布尔值。将tick()中的所有布尔检查全部用于拥有单独的ifs。如果持续按下任何一个按钮,代码永远不会进入VelX和VelY重置为零的最后一个else块。
将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);
}