2016-08-22 4 views
3

Ich versuche, eine Art von First-Person-Ansicht 3D-Spiel in JavaFX zu schreiben und die Bewegung funktioniert bisher ziemlich gut.JavaFX KeyEvents sind verzögert, wenn robot.moveMouse() verwendet

Ich verwende JavaFX integrierte Form und PerspectiveCamera-Klassen, um das Bild in die Szene zu rendern.

Aber es gibt eine Eingabeverzögerung von ungefähr 1-2 Sekunden für alle Schlüsselereignisse.

Die lags nur erscheinen:

  • , sobald das Programm zu Vollbild umgeschaltet wird (auch eingeschaltet, wenn wieder noch da sind sie zu Fenstermodus, aber nicht, wenn das Programm wurde gerade begonnen)

  • und die Kamera wird mit der Maus gedreht mit kurz vor dem Drücken/Loslassen einer Taste

z.B .: Ich drücke W, um vorwärts zu gehen und gleichzeitig die Maus zu bewegen. Wenn ich W jetzt loslasse, würde der Spieler noch 1-2 Sekunden vorwärts gehen. Ohne die Maus zu bewegen passiert es nicht.

Dies ist, wie der Eingang verfolgt wird:

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

und (für keyReleased (e) es ist das gleiche nur mit "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; 
} 

Für die Kamerabewegung i mit dieser Funktion :

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

Wenn ich "robot.mouseMove (centerx, centery)," entfernen alles funktioniert gut. Auch wenn ich die Kamerabewegung über die Pfeiltasten steuere, gibt es auch keine Verzögerungen.

Die ganze Spielschleife ist in JavafX AnimationTimer verpackt, die eine stabile Framerate gibt.

Eine weitere kleine Beobachtung: Da das Programm gerade gestartet ist, gibt es viele kleine Stotter. Sobald ich auf Vollbild umschalte, läuft das Programm butterweich (trotz der Eingabefehler natürlich. Aber die Maus hat überhaupt keine Eingabefolge).

Ich kann den vollständigen Code bei Bedarf hochladen oder ein Video hochladen, wenn das Problem nicht klar genug ist.

Antwort

0

So habe ich herausgefunden, dass die ganze main/Spiel-Schleife in einem anderen Thread offenbar behebt das Problem läuft. Es gibt keinen Input-Lag mehr und die Ruckler sind auch weg.

Falls es jemand, der in meiner Lösung interessiert ist, hier ist sie:

Zuerst habe ich die ganze Zeug aus der Spiel-Schleife in einer Funktion „mainloop()“ gepackt, die in etwa wie folgt aussieht:

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

Dann habe ich einen neuen Thread und nur die mainloop put() drin:

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

Schließlich wird der Faden mit einem AnimationTimer genannt:

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

Ich bin nicht sicher, ob dies ein effizienter Weg ist, dieses Problem zu lösen, aber es scheint zu funktionieren.

Verwandte Themen