使用robot.moveMouse()

时间:2016-08-22 21:00:58

标签: java javafx 3d delay keyevent

我正在尝试在JavaFX中编写某种第一人称视图3D游戏,到目前为止该运动效果还不错。

我正在使用JavaFX的内置形状和PerspectiveCamera类将图像渲染到场景中。

但所有关键事件的输入延迟约为1-2秒。

只会出现延迟:

  • 一旦程序切换到全屏(即使切换回窗口,它们仍然存在,但程序刚启动时却没有)

  • 在按下/释放按钮之前不久
  • 使用鼠标旋转

例如:我按W向前移动并同时移动鼠标。如果我现在释放W,那么玩家仍然可以向前移动1-2秒。 没有移动鼠标就不会发生。

这是跟踪输入的方式:

scene.setOnKeyPressed(e -> keyPressed(e));
scene.setOnKeyReleased(e -> keyReleased(e));

和(对于keyReleased(e),它与“false”相同)

private void keyPressed(KeyEvent e) {
    if (e.getCode().toString() == "W") w = true;
    if (e.getCode().toString() == "A") a = true;
    if (e.getCode().toString() == "S") s = true;
    if (e.getCode().toString() == "D") d = true;
}

对于相机移动,我使用此功能:

private void mouseMovement(){
    if(primaryStage.isFocused()){
        mxdelta = MouseInfo.getPointerInfo().getLocation().getX() - centerx;
        mydelta = MouseInfo.getPointerInfo().getLocation().getY() - centery;

        // Rotate Camera
        cry += mxdelta * sens; // cry = camera rotation around y-axis
        crx -= mydelta * sens; // crx = camera rotation around x-axis

        // move curser back to the center of the screen
        robot.mouseMove(centerx, centery);
    }
}

如果我删除“robot.mouseMove(centerx,centery);”一切正常。此外,如果我通过箭头键控制相机移动也没有滞后。

整个游戏循环包含在JavafX的AnimationTimer中,它提供稳定的帧速率。

另一个小观察:由于该计划刚刚启动,因此有许多小口吃。一旦我切换到全屏程序,程序运行黄油顺利(尽管输入滞后当然。但鼠标根本没有输入延迟。)

如果需要,我可以发布完整的代码,如果问题不够明确,我可以上传视频。

1 个答案:

答案 0 :(得分:0)

所以我发现在另一个帖子中运行整个主/游戏循环显然修复了问题。没有输入滞后,口吃也消失了。

如果有人对我的解决方案感兴趣,请点击这里:

首先,我将游戏循环中的所有内容打包在函数“mainloop()”中,看起来大致如下:

public void mainloop(){
    mouseMovement(); // <- full function is in the question above
    updatePosition();
    collisionDetection();
}

然后我创建了一个新主题,并且只将 mainloop()放入其中:

Thread t = new Thread() {
    public void run() {
        Platform.runLater(new Runnable() {
            public void run() {
                mainloop();}
        });
    }
};
t.setDaemon(true);

最后使用 AnimationTimer

调用线程
new AnimationTimer() {
    @Override public void handle(long now) {
        t.run();
    }
}.start();

我不确定这是否是解决此问题的有效方法,但似乎有效。