gpt4 book ai didi

Java - KeyListener 多个按钮按下

转载 作者:行者123 更新时间:2023-12-02 05:16:01 29 4
gpt4 key购买 nike

我希望我能以正确的方式描述我的问题。我现在正在编写一个简单的双杆射击游戏,因此我实现了一个实现 KeyListener 的 KeyInputHandler 类。但是当玩家同时按下 2 个按钮时我遇到了问题。玩家实际移动之前总是需要一秒钟的时间。据我所知,这是因为按键重复。我可能错了。我用谷歌搜索了一下,在这里找到了一个可能的解决方案: https://gamedev.stackexchange.com/questions/51623/smoother-controls?rq=1人们建议不要在按键时改变玩家的 x 和 y 速度,而是在玩家按下某个按钮时标记方向并以不同的方法处理移动。因此,我创建了 boolean 变量并在按下按钮时激活它们:

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()方法在主游戏循环中调用)

现在的问题是不再有延迟(是的),但是当我同时按下 2 个按钮时,事情变得很奇怪。示例:

  1. 我按左按钮
  2. 我按下向下按钮
  3. 我放开了向下按钮 -> 对象仍然向左下移动
  4. 我按下向上键 -> 对象向左上方移动

但是当我按住“向右”然后同时按住“向下”时,它只是向下移动。

我还检查了 boolean 变量,它们正在正确刷新。这有点奇怪,我不太确定如何处理这个问题以及到底是什么导致了这种行为。我假设这与检查冷却器的顺序有关。也许有人可以在这件事上帮助我。我将不胜感激。 :)

最佳答案

同时按下多个按键时事情变得奇怪的问题是您在检查 boolean 值时使用了 if else 。将 tick() 中的所有 boolean 检查分开以拥有单独的 if。如果持续按下任何一个按钮,代码永远不会进入最后一个 else block ,其中 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);
}

关于Java - KeyListener 多个按钮按下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26947311/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com