2016-09-03 34 views
1

我想了解在javafx中編程3D。我的目標是將光標鎖定在中心或將其移至中心以獲得第一人稱視角。JavaFX第一人稱中心鼠標

我做了一個鼠標移動事件,我將光標移動到屏幕中間,然後根據我將鼠標移動到的位置更改相機。問題在於,無論何時將光標移回中心,事件都會再次觸發相機角度的變化。任何人都知道如何將光標移回中心時,它不會影響相機角度?

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

以下是添加了布爾檢查後... 我定義的「ignoreMouseMove」別的地方。

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

回答

0

你只需要一個布爾檢查,如:

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

如果它可以幫助你在這裏爲我做我自己在幾個星期前的實現,工作原理:

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

我添加了布爾檢查就像你說的,它仍然沒有工作 – Ale

+0

所以你仍然得到'mouseEvents'的行爲遞歸調用自己無限的時間? – Jhonny007

+0

是的,你想看看整個代碼? – Ale