SubScene摄像头覆盖

时间:2019-07-10 11:26:15

标签: javafx 3d

我正在尝试创建一个可以自上而下移动并相互影响的对象的世界。我也想放大和缩小,以查看越来越少的世界。因此,我需要一个世界的子场景,一个带有UI和其他信息的覆盖层,以及一个不会影响UI,但可以根据播放器对象的位置向左上右下移动并缩放的摄像头。

我尝试将世界作为主要场景,也将其作为子场景。目前,我有一个世界作为子场景,应该是摄像机所在的位置并且可以缩放等,并且第一个场景上有一个绿色圆圈作为UI的基础,但是我无法像我那样在子场景中移动对象当他们在第一个场景时。

@Override     public void start(Stage primaryStage){

    Random rand = new Random(50);
    Circle circle2 = new Circle(800, 450, 20);
    circle2.setCenterX(800);
    circle2.setCenterY(450);
    circle2.setFill(Color.GREEN);
    circle2.setVisible(true);
    Pane root = new Pane(circle2);
    overlayTest(root);
    Scene scene = new Scene(root, 1600, 900);
    scene.setFill(Color.rgb(20, 255, 231, 0.6));
    Image sea = new Image("file:seaTest2.jpg");
    ImagePattern pattern = new ImagePattern(sea);
    scene.setFill(pattern);
    primaryStage.setScene(scene);
    primaryStage.setTitle("Camera!");
    primaryStage.show();
}
private SubScene overlayTest(Pane root) {
    ObservableSet<KeyCode> downKeys = FXCollections.observableSet();
    Circle circle2 = new Circle(200, 200, 20);
    circle2.setCenterX(200);
    circle2.setCenterY(200);
    circle2.setFill(Color.GREEN);
    circle2.setVisible(true);
    root.getChildren().add(circle2);
    SubScene overlay = new SubScene(root, 1600, 900);
    overlay.setVisible(true);
    overlay.setOpacity(0.1);
    PerspectiveCamera camera = new PerspectiveCamera(true);
    camera.setTranslateZ(-700);
    camera.setNearClip(0.1);
    camera.setFarClip(2000.0);
    camera.setFieldOfView(35);
    overlay.setCamera(camera);
    Timeline timer = new Timeline(new KeyFrame(
            javafx.util.Duration.millis(16), ae -> {
        downKeys.stream().parallel().forEach(kc -> {
            Platform.runLater(() -> {
                switch (kc) {
                    case C:
                        camera.setTranslateZ(camera.getTranslateZ() - 5);
                        break;
                    case Z:
                        camera.setTranslateZ(camera.getTranslateZ() + 5);
                        break;
                    case W:
                        camera.setTranslateY(camera.getTranslateY() - 5);
                        break;
                    case A:
                        camera.setTranslateX(camera.getTranslateX() - 5);
                        break;
                    case S:
                        camera.setTranslateY(camera.getTranslateY() + 5);
                        break;
                    case D:
                        camera.setTranslateX(camera.getTranslateX() + 5);
                        break;
                }
            });
        });
    }));
    timer.setCycleCount(Animation.INDEFINITE);
    timer.play();
    downKeys.addListener((SetChangeListener.Change<? extends KeyCode> change) -> {
    });
    return overlay;
}

}

0 个答案:

没有答案