我正在尝试在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中,它提供稳定的帧速率。
另一个小观察:由于该计划刚刚启动,因此有许多小口吃。一旦我切换到全屏程序,程序运行黄油顺利(尽管输入滞后当然。但鼠标根本没有输入延迟。)
如果需要,我可以发布完整的代码,如果问题不够明确,我可以上传视频。
答案 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();
我不确定这是否是解决此问题的有效方法,但似乎有效。