Java - KeyListener按下多个按钮

时间:2014-11-15 15:16:53

标签: java awt 2d controls keylistener

我希望我能以正确的方式描述我的问题。我正在编写一个简单的双棒射击游戏,所以我实现了一个实现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个按钮时,事情会变得奇怪。例如:

  1. 我按下左按钮
  2. 我按下按钮
  3. 我让按下按钮去 - >物体仍然向左下方
  4. 我按下 - >对象上升
  5. 但是当我按住Right然后als按住它时它就会向下移动。

    我还检查了布尔变量,它们正在正确刷新。 这有点奇怪,我不确定如何处理这个以及究竟是什么导致了这种行为。我假设它与检查冷却的顺序有关。也许某人可以帮我解决这个问题。我将不胜感激。 :)

1 个答案:

答案 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);
}