Java: Множество въвеждане от клавиатурата по време на период на таймер

В моето училище, като задача, трябва да направя подобрена версия на играта "SNAKE".

(Няма да добавя допълнително описание, тъй като това е много известно)

Имам проблеми с въвеждането от клавиатурата.

Нещата по-долу са обобщение на моя код.


КОД

Начална част

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;
}

ДА ПОПРАВЯ

Моята програма не обработва правилно множество бързи входове.

Например, да кажем, че змията се е движела надясно.

оооооо (->)

Ако натисна бързо "нагоре" и "наляво" по време на ЗАБАВЯНЕТО (което е 500 ms),

след това змията се насочва наляво и се движи по тялото си.

оооооо (‹-)

Как трябва да променя частта за въвеждане на клавиатурата, за да разреша този проблем?


СЪСТОЯНИЕ

Професорът даде шаблонен код за частите за въвеждане на клавиатурата като тази.

private class TAdapter extends KeyAdapter {

    @Override
    public void keyPressed(KeyEvent e) {

        //Keyboard input part (PROBLEM)

person Donggun Jung    schedule 03.06.2016    source източник
comment
Какъв е въпросът ?   -  person Nir Alfasi    schedule 03.06.2016
comment
@alfasin Как трябва да променя частта за въвеждане на клавиатурата, за да разреша този проблем?   -  person Donggun Jung    schedule 03.06.2016


Отговори (1)


Ще ви трябват два набора полета. Единият набор описва последно натиснатия клавиш за посока, докато другият описва действителната посока на движение, последно приложена в действието на таймера:

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

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

Както бихте очаквали, полетата „Натиснати“ се задават само от KeyListener.

След това действието на таймера трябва да прочете тези *Натиснати полета и съответно да зададе подвижните* полета. Това позволява на вашия KeyListener да забрани обръщането на посоката въз основа на последната приложена посока, а не само на последния натиснат клавиш:

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

Може да откриете, че използването на enum е по-лесно от поддържането на група от четири булеви стойности. Например:

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

private Direction lastKeyPressed;
private Direction movement;
person VGR    schedule 03.06.2016
comment
невероятно Наистина ми помогна да практикувам enum. Благодаря ти много. - person Donggun Jung; 04.06.2016
comment
Въпреки това, когато се насочи надясно, ако натисна нагоре и наляво бързо (по време на DELAY), това се повишава. Как мога да предотвратя това? (взима се само последно въведено) - person Donggun Jung; 04.06.2016
comment
@DonggunJung Може да искате да публикувате нов въпрос за това, който включва последния ви код. - person VGR; 05.06.2016