Я пытаюсь переместить прямоугольник по экрану с помощью WASD.Моя проблема заключается в том, что, когда пользователь пытается изменить направление весла в два раза слишком быстро (скажем, вы нажимаете влево, затем вправо и снова влево очень быстро), объект замирает на долю секунды и продолжает двигаться вдоль своего направления.Я открыт для идей о том, как это исправить.Спасибо.
Глобальные переменные
int velocityX = 0;
int velocityY = 0;
Boolean flagA = false;
Boolean flagD = false;
Boolean flagW = false;
Boolean flagS = false;
Sprite player = new Sprite(100, 100, 60, 60, "player", Color.BLACK);
Thread t1;
Thread t2;
Thread t3;
Определения потоков для движения (seOnKeyPressed)
t1 = new Thread(new Runnable() {
@Override
public void run() {
while(true) {
scene.setOnKeyPressed(e -> {
switch(e.getCode()) {
case A:
flagA = true;
player.velocityX = -1;
break;
case D:
flagD = true;
player.velocityX = 1;
break;
case W:
flagW = true;
player.velocityY = -1;
break;
case S:
flagS = true;
player.velocityY = 1;
break;
}
});
}
}
});
Определение потоков (setOnKeyReleased)
t2 = new Thread(new Runnable() {
@Override
public void run() {
while(true) {
scene.setOnKeyReleased(e -> {
switch(e.getCode()) {
case A:
flagA = false;
player.velocityX = 0;
break;
case D:
flagD = false;
player.velocityX = 0;
break;
case W:
flagW = false;
player.velocityY = 0;
break;
case S:
flagS = false;
player.velocityY = 0;
break;
}
});
}
}
});
AnimationTimer для обновления местоположения объекта на экране
AnimationTimer timer = new AnimationTimer() {
@Override
public void handle(long now) {
player.setTranslateX(player.getTranslateX() + player.velocityX);
player.setTranslateY(player.getTranslateY() + player.velocityY);
}
};
Запуск программы
//Starting threads
t1.start();
t2.start();
//AnimationTimer for updating X & Y location
timer.start();