在我的学校,作为一项任务,我必须改进版本的“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)
答案 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;