2016-09-03 3 views
1

Ich versuche zu lernen, 3D-Programmierung in Javafx. Mein Ziel ist es, den Cursor für eine First-Person-Ansicht in der Mitte zu fixieren oder in die Mitte zu verschieben.JavaFX Erste Person zentrieren Maus

Ich machte eine Maus bewegte Ereignis und ich bewege den Cursor in die Mitte des Bildschirms, dann ändern Sie die Kamera je nachdem, wohin ich die Maus bewegte. Das Problem besteht darin, dass das Ereignis immer dann ausgelöst wird, wenn der Cursor zurück in die Mitte bewegt wird, wobei die Änderung des Kamerawinkels umgekehrt wird. Wer weiß, wie man das macht, wenn man den Cursor zurück in die Mitte bewegt, beeinflusst das nicht den Kamerawinkel?

scene.setOnMouseMoved(e -> { 
     int screenWidth = (int) Screen.getPrimary().getBounds().getWidth(); 
     int screenHeight = (int) Screen.getPrimary().getBounds().getHeight(); 
     moveCursor(screenWidth/2, screenHeight/2); 
     double dx = mouseX - e.getSceneX(); 
     double dy = mouseY - e.getSceneY(); 
     mouseX = e.getSceneX(); 
     mouseY = e.getSceneY(); 
     camAngleX += dx/10; 
     camAngleY -= dy/10; 
    }); 

ist hier nach der Booleschen Check Hinzufügen ... I definiert "ignoreMouseMove" woanders.

scene.setOnMouseMoved(e -> { 
     if (ignoreMouseMove) { 
      ignoreMouseMove = false; 
     } else { 
      double cx = primaryStage.getX() + scene.getX() + sceneX/2; 
      double cy = primaryStage.getY() + scene.getY() + sceneY/2; 
      double dx = mouseX - e.getSceneX(); 
      double dy = mouseY - e.getSceneY(); 
      mouseX = e.getSceneX(); 
      mouseY = e.getSceneY(); 
      camAngleX += dx/10; 
      camAngleY -= dy/10; 
      ignoreMouseMove = true; 
      moveMouse(cx, cy); 
     } 
    } 

Antwort

0

Sie haben soeben einen boolean-Check benötigen wie:

boolean ignoreMouseMove = false; 

scene.setOnMouseMoved(e -> { 
    if(ignoreMouseMove) { 
     ignoreMouseMove = false; 
    } else { 
     int screenWidth = (int) Screen.getPrimary().getBounds().getWidth(); 
     int screenHeight = (int) Screen.getPrimary().getBounds().getHeight(); 
     ignoreMouseMove = true; 
     moveCursor(screenWidth/2, screenHeight/2); 
     double dx = mouseX - e.getSceneX(); 
     double dy = mouseY - e.getSceneY(); 
     mouseX = e.getSceneX(); 
     mouseY = e.getSceneY(); 
     camAngleX += dx/10; 
     camAngleY -= dy/10; 
    } 
}); 

Wenn es Ihnen hier hilft, ist eine Implementierung ich mich vor ein paar Wochen hat das funktioniert:

Robot mouseMover = new Robot(); //defined somewhere else 

scene.setOnMouseMoved(event -> { 
    if(ignoreMouseEvent) { 
     ignoreMouseEvent = false; 
     return; 
    } 

    mouseDeltaX += Math.round(event.getScreenX() - (stage.getX() + (stage.getWidth()/2.0)))/5.0; 
    mouseDeltaY += -Math.round((event.getScreenY() - (stage.getY() + (stage.getHeight()/2.0))))/5.0; 

    ignoreMouseEvent = true; 
    mouseMover.mouseMove((int) (stage.getX() + (stage.getWidth()/2.0)), (int) (stage.getY() + (stage.getHeight()/2.0))); 
}); 
+0

ich die boolean hinzugefügt Überprüfen Sie, wie Sie sagten, und es hat immer noch nicht funktioniert – Ale

+0

So bekommen Sie immer noch das Verhalten von 'MausEreignisse' nennen sich rekursiv eine unendliche Menge an Zeit? – Jhonny007

+0

Ja, möchten Sie den ganzen Code sehen? – Ale

Verwandte Themen