2016-05-16 2 views
2

Wie kann ich eine Verbindung mit den Keyboard/Mouse-Ereignissen mit Scene Builder herstellen? Mein Code sieht so aus:Connection Controller mit Szenenerzeuger-Ereignissen

@FXML 
    public void onKeyPressed() { 
      group.getScene().setOnKeyPressed(event -> { 
       double change = 10.0; 
       if(event.isShiftDown()) { change = 50.0; } 
       KeyCode keycode = event.getCode(); 
       if(keycode == KeyCode.W) { perspectiveCamera.setTranslateZ(perspectiveCamera.getTranslateZ() + change); } 
       if(keycode == KeyCode.S) { perspectiveCamera.setTranslateZ(perspectiveCamera.getTranslateZ() - change); } 
       if(keycode == KeyCode.A) { perspectiveCamera.setTranslateX(perspectiveCamera.getTranslateX() - change); } 
       if(keycode == KeyCode.D) { perspectiveCamera.setTranslateX(perspectiveCamera.getTranslateX() + change); } 
      });  
    } 
    @FXML 
    public void onMousePressed() { 
     group.getScene().setOnMousePressed((MouseEvent me) -> { 
      mousePosX = me.getSceneX(); 
      mousePosY = me.getSceneY(); 
      mouseOldX = me.getSceneX(); 
      mouseOldY = me.getSceneY(); 
     }); 
    } 
    @FXML 
    public void onMouseDragged() { 
     group.getScene().setOnMouseDragged((MouseEvent me) -> { 
      mouseOldX = mousePosX; 
      mouseOldY = mousePosY; 
      mousePosX = me.getSceneX(); 
      mousePosY = me.getSceneY(); 
      mouseDeltaX = (mousePosX - mouseOldX); 
      mouseDeltaY = (mousePosY - mouseOldY); 

      double modifier = 10.0; 
      double modifierFactor = 0.1; 

      if (me.isControlDown()) { 
       modifier = 0.1; 
      } 
      if (me.isShiftDown()) { 
       modifier = 50.0; 
      } 
      if (me.isPrimaryButtonDown()) { 
       cameraTransformer.ry.setAngle(((cameraTransformer.ry.getAngle() + mouseDeltaX * modifierFactor * modifier * 2.0) % 360 + 540) % 360 - 180); // + 
       cameraTransformer.rx.setAngle(((cameraTransformer.rx.getAngle() - mouseDeltaY * modifierFactor * modifier * 2.0) % 360 + 540) % 360 - 180); // - 
      } else if (me.isSecondaryButtonDown()) { 
       double z = perspectiveCamera.getTranslateZ(); 
       double newZ = z + mouseDeltaX * modifierFactor * modifier; 
       perspectiveCamera.setTranslateZ(newZ); 
      } else if (me.isMiddleButtonDown()) { 
       cameraTransformer.t.setX(cameraTransformer.t.getX() + mouseDeltaX * modifierFactor * modifier * 0.3); // - 
       cameraTransformer.t.setY(cameraTransformer.t.getY() + mouseDeltaY * modifierFactor * modifier * 0.3); // - 
      } 
     }); 
    } 

Und das Panel Szene Erbauer:

ich in der gleichen Art und Weise in der Regel immer tun und es funktioniert, aber jetzt diese Platte mit nicht. Wo mache ich Fehler?

enter image description here

enter image description here

Antwort

1

Was die Mausereignisse, setzte sie in den anchorpane:

<AnchorPane onMouseDragged="#onMouseDragged" onMousePressed="#onMousePressed" ...> 
    <children> 
     <Group fx:id="group" /> 
    </children> 
</AnchorPane> 

und jetzt in Ihrem Controller direkt das Ereignis übergeben:

@FXML 
private void onMousePressed(MouseEvent me) { 
    mousePosX = me.getSceneX(); 
    mousePosY = me.getSceneY(); 
    mouseOldX = me.getSceneX(); 
    mouseOldY = me.getSceneY(); 
} 

@FXML 
private void onMouseDragged(MouseEvent me) { 
    mouseOldX = mousePosX; 
    mouseOldY = mousePosY; 
    mousePosX = me.getSceneX(); 
    mousePosY = me.getSceneY(); 
    ... 
} 

Was das gedrückte Key-Event angeht, scheint es die Szene t zu sein akes dieses Ereignis und verbraucht, so müssen Sie es aus der Szene an die Steuerung propagieren:

@Override 
public void start(Stage stage) throws Exception { 
    FXMLLoader loader = new FXMLLoader(getClass().getResource("Window3DSceneView.fxml")); 
    Parent root = loader.load(); 
    Window3DController controller = loader.getController(); 

    Scene scene = new Scene(root, 1200, 800, true, SceneAntialiasing.BALANCED); 
    scene.setOnKeyPressed(e -> controller.onKeyPressed(e)); 
    ... 
} 

Und jetzt in Ihrem Controller:

public void onKeyPressed(KeyEvent event) { 
     double change = 10.0; 
     if(event.isShiftDown()) { change = 50.0; } 
     KeyCode keycode = event.getCode(); 
     ... 
} 
+0

Danke, seine Arbeit jetzt sah ich, auch u hinzugefügt 2 weitere Argumente für den Szenenkonstruktor "true, SceneAntialiasing.BALANCED" nach dem Hinzufügen dieser habe ich unerwünschte Wirkung, hochgeladen auf meine Frage, was verursacht dies? – yerpy

+0

Depth buffer ist erforderlich, wenn Sie mehr Objekte für die tiefe sortierte Darstellung haben, denn jetzt brauchen Sie sie nicht, also können Sie sie auf false setzen und sehen, dass das Artefakt verschwindet. Was das Antialiasing betrifft, beeinflusst es die Glätte der gerenderten Szene. Versuche es auch zu deaktivieren. –

+0

Weiß nicht warum, aber ich habe dieses Problem, während ich die Maus drücke, was kann Ursache sein? Habe bearbeitet. – yerpy