Движение с помощью setOnKeyPressed и setOnKeyReleased - PullRequest
0 голосов
/ 22 ноября 2018

Я написал код для управления движением маленького прямоугольника на экране с помощью JavaFX.По сути, я плавно перемещаю игрока по игровому циклу с помощью следующих кодов:

(PS: игрок - мой объект)

player.setTranslateX(player.getTranslateX() + player.velocityX);
player.setTranslateY(player.getTranslateY() + player.velocityY);

И это привязки клавиш:

myScene.setOnKeyPressed(e -> {
   Thread t1;

   t1 = new Thread(new Runnable() {
      @Override
      public void run() {
         switch(e.getCode()) {
            case A:
            player.velocityX = -1;
            break;

            case D:
            player.velocityX = 1;
            break;

            case W:
            player.velocityY = -1;
            break;

            case S:
            player.velocityY = 1;
            break;
         }
      }
   }); 
   t1.start();
})

Разблокировка клавиш:

myScene.setOnKeyReleased(e -> {
   Thread t2;

   t2 = new Thread(new Runnable() {
      @Override
      public void run() {
         switch(e.getCode()) {
            case A:
            player.velocityX = 0;
            break;

            case D:
            player.velocityX = 0;
            break;

            case W:
            player.velocityY = 0;
            break;

            case S:
            player.velocityY = 0;
            break;
         }
      }
   });
   t2.start();
})

Работает нормально, но есть ошибка, что при одновременном нажатии нескольких клавиш и отпускании одной из них объекты перестают двигаться, пока я не отпущу палецвыключите клавишу и нажмите клавишу еще раз.Теперь я знаю, что это как-то связано с концепцией неоднозначности, но я попал в кирпичную стену и открыт для идей.

1 Ответ

0 голосов
/ 22 ноября 2018

Я сталкивался с этой проблемой раньше, когда писал игру, как вы пишете.

После нескольких отладок выглядело, как будто проблема на самом деле связана с кодом, который вы пишете, а скорее с самой библиотекой.Кажется, что если вы удерживаете несколько клавиш, буфер полученных нажатий клавиш «заклинивает» и не отвечает, пока вы не отпустите и не нажмете снова.

Один из способов решения этой проблемы на Mac - запуститьследующая команда в терминале:

defaults write NSGlobalDomain ApplePressAndHoldEnabled -bool false

Это, кажется, исправило поведение.Для Windows мы не смогли найти ничего, что могло бы решить проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...