Java-KeyListener多按钮按下

Java-KeyListener多按钮按下,java,awt,2d,controls,keylistener,Java,Awt,2d,Controls,Keylistener,我希望我能用正确的方式描述我的问题。我现在正在编写一个简单的双杆射击程序,所以我实现了一个实现KeyListener的KeyInPurthandler calss。但当播放器同时按下两个按钮时,我遇到了一个问题。球员真正移动总是需要一秒钟的时间。据我所知,这是因为关键的重复。我可能错了。我在谷歌上搜索了一下,在这里找到了一个可能的解决方案: 人们建议不要在按键时改变玩家的x和y速度,而是在玩家按下某个按钮时标记方向,并用不同的方法处理移动。因此,我创建了布尔变量,并在按下按钮时激活它们: pub

我希望我能用正确的方式描述我的问题。我现在正在编写一个简单的双杆射击程序,所以我实现了一个实现KeyListener的KeyInPurthandler calss。但当播放器同时按下两个按钮时,我遇到了一个问题。球员真正移动总是需要一秒钟的时间。据我所知,这是因为关键的重复。我可能错了。我在谷歌上搜索了一下,在这里找到了一个可能的解决方案: 人们建议不要在按键时改变玩家的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()方法)

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

  • 我按左键
  • 我按下向下按钮
  • 我按下按钮->对象仍然向左向下
  • 我按向上->对象向左上
  • 但当我按住右边,然后按住它,它只是向下移动

    我还检查了布尔变量,它们被正确刷新。
    这有点奇怪,我真的不知道如何处理,到底是什么导致了这种行为。我假设这与检查冷却器的顺序有关。也许有人能在这件事上帮我。我将不胜感激

    在同时按下多个键时,事情变得奇怪的原因是,您正在使用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);
    } 
    

    工作起来很有魅力。是的,如果问题出在其他地方。我没有意识到这一点。谢谢:)