2016-09-03 5 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