Java:“计时器”期间的多个键盘输入

时间:2016-06-03 16:22:00

标签: java timer keyboard

在我的学校,作为一项任务,我必须改进版本的“SNAKE”游戏。

(我不会再加上进一步的描述,因为这很有名)

我在处理键盘输入时遇到了麻烦。

以下内容是我的代码摘要。

CODE

  

启动部分

private final int DELAY = 500; //500ms every event

timer = new Timer(DELAY, this);
timer.start();
  

键盘输入部分(问题)

int key=e.getKeyCode();

if ((key == KeyEvent.VK_LEFT) && (!rightDirection)) {
    leftDirection = true;
    upDirection = false;
    downDirection = false;
}

if ((key == KeyEvent.VK_RIGHT) && (!leftDirection)) {
    rightDirection = true;
    upDirection = false;
    downDirection = false;
}

if ((key == KeyEvent.VK_UP) && (!downDirection)) {
    upDirection = true;
    rightDirection = false;
    leftDirection = false;
}

if ((key == KeyEvent.VK_DOWN) && (!upDirection)) {
    downDirection = true;
    rightDirection = false;
    leftDirection = false;
}

要修复

我的程序无法正确处理多个快速输入。

例如,假设蛇正向右移动。

  

ooooooO( - >)

如果我在DELAY(500毫秒)内快速按“向上”和“向左”,

然后蛇向左转并移动到它的身体上。

  

oooooOo(< - )

如何更改键盘输入部分以解决此问题?

CONDITION

教授给出了像这样的键盘输入部分的模板代码。

private class TAdapter extends KeyAdapter {

    @Override
    public void keyPressed(KeyEvent e) {

        //Keyboard input part (PROBLEM)

1 个答案:

答案 0 :(得分:1)

您需要两组字段。一组描述了最近按下的方向键,而另一组描述了最近在Timer动作中实现的实际移动方向:

private boolean leftPressed;
private boolean rightPressed;
private boolean upPressed;
private boolean downPressed;

private boolean movingLeft;
private boolean movingRight;
private boolean movingUp;
private boolean movingDown;

正如您所料,“Pressed”字段仅由KeyListener设置。

然后,Timer动作应该读取那些* Pressed字段,并相应地设置移动*字段。这允许您的KeyListener根据最后实现的方向禁止方向反转,而不仅仅是最后按下的键:

if (key == KeyEvent.LEFT && !movingRight) {
    leftPressed = true;
    rightPressed = false;
    upPressed = false;
    downPressed = false;
}

您可能会发现使用枚举比维护一组四个布尔值更容易。例如:

private enum Direction { LEFT, RIGHT, UP, DOWN }

private Direction lastKeyPressed;
private Direction movement;