首页 > 解决方案 > 使用 setOnKeyPressed 和 setOnKeyReleased 移动

问题描述

我编写了一些代码来使用 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();
})

它工作正常,但有一个错误,当我同时按下多个键并释放其中一个时,对象停止移动,直到我将手指从键上松开并再次按下键。现在我知道这与歧义概念有关,但我已经碰壁了,我对想法持开放态度。

标签: javajavafx

解决方案


我之前在编写游戏时遇到过这个问题,就像你正在写的一样。

经过一堆调试,看起来问题实际上与您正在编写的代码有关,而不是与库本身有关。似乎如果您按住多个键,则接收到的按键缓冲区会“卡住”,并且在您松开并再次按下之前它不会响应。

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

defaults write NSGlobalDomain ApplePressAndHoldEnabled -bool false

这似乎解决了这种行为。对于 Windows,我们无法找到任何解决问题的方法。


推荐阅读