Неоднозначность движения объекта - PullRequest
0 голосов
/ 23 ноября 2018

Я пытаюсь переместить прямоугольник по экрану с помощью 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...