使用setOnKeyPressed和setOnKeyReleased进行移动

时间:2018-11-22 16:37:24

标签: java javafx

我编写了一些代码来用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 :(得分:0)

在像编写游戏一样编写游戏之前,我就遇到了这个问题。

经过一堆调试,看起来问题实际上与您正在编写的代码有关,而不是与库本身有关。看来,如果您按住多个键,则接收到的按键按下的缓冲区将被“阻塞”,并且直到您放开并再次按下后它才响应。

在Mac上,一种解决方法是在终端中运行以下命令:

defaults write NSGlobalDomain ApplePressAndHoldEnabled -bool false

这似乎可以解决问题。对于Windows,我们找不到任何可解决此问题的东西。