2016-08-22 2 views
3

Я пытаюсь написать какую-то трехмерную 3D-игру первого лица в JavaFX, и пока движение работает довольно хорошо.JavaFX KeyEvents задерживаются при использовании robot.moveMouse()

Я использую встроенные формы JavaFX и классы PerspectiveCamera для рендеринга изображения на сцену.

Но для всех ключевых событий есть интервал времени около 1-2 секунд.

лаги появляются только:

  • раз программа переключается на полный экран (даже если переключен обратно в оконном они все еще там, но не тогда, когда программа только началась)

  • и камера поворачивается при помощи мыши незадолго до нажатия/отпускания кнопки

например: Я нажимаю W для перемещения вперед и одновременно перемещения мыши. Если я выпущу W, игрок все равно будет двигаться вперед на 1-2 секунды. Не перемещая мышь, этого не происходит.

Это, как отслеживается вход:

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

и (для keyReleased (е) это же просто с «ложным»)

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);" все работает нормально. Также, если я управляю движением камеры с помощью клавиш со стрелками, также нет лаг.

Весь игровой цикл упакован в AnimationTimer JavafX, который дает стабильную частоту кадров.

Еще одно небольшое наблюдение: по мере того, как программа только запускается, существует множество мелких заиканий. Как только я переключаюсь на полноэкранный режим, программа работает масляно-гладкой (несмотря на входную задержку, конечно, но у мыши нет никакого входного запаздывания).

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

ответ

0

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

В случае, если есть кто-то, кто заинтересован в моем решении, вот оно:

Сначала я собрал все вещи с игрового цикла в функции «основного цикла()», который выглядит примерно так:

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(); 

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

Смежные вопросы