具有多个屏幕的JavaFX游戏

时间:2016-06-17 16:13:27

标签: java user-interface javafx 2d-games

我是JavaFX的新手,我想用JavaFX创建一个简单的2D游戏。我读了这篇JavaFX game tutorial,我发现它非常有用。我写了一个简单的游戏,结构如下:

public class MyGame extends Application 
{
(...)      
public void start(Stage theStage) 
{
    (...)
    Group root = new Group();
    Scene theScene = new Scene( root );
    theStage.setScene( theScene );

    Canvas canvas = new Canvas( 800, 600 );
    root.getChildren().add( canvas );
    (...)               
    theScene.setOnMouseClicked(
            new EventHandler<MouseEvent>()
                {
                    public void handle(MouseEvent e)
                    {
                        //mouse events                
                    }
                });
    final GraphicsContext gc = canvas.getGraphicsContext2D();
   (...)
    final LongValue lastNanoTime = new LongValue( System.nanoTime() );

    new AnimationTimer()
    {

        public void handle(long currentNanoTime)
        {

            double elapsedTime = (currentNanoTime - lastNanoTime.value) / 1000000000.0;
            lastNanoTime.value = currentNanoTime;
            //drawing all sprites with gc etc.
        }
    }.start();

    theStage.show();
}
}

我对结果非常满意。游戏中没有菜单等,只有一个游戏本身的屏幕。问题是,我现在想要扩展应用程序并在其中包含一些不同的游戏,这意味着我需要处理几个不同的屏幕(主菜单和每个游戏)并在它们之间切换。我在互联网上寻求帮助,但我发现的只是FXML的一些例子,我并没有真正使用它。

我的问题是:考虑到我现在拥有的结构,如何轻松创建其他几个屏幕并在它们之间切换?

1 个答案:

答案 0 :(得分:0)

为什么不使用不同的场景? 这是我刚刚做的一个小例子:

public void start(Stage primaryStage){
        Group g1 = new Group();
        Group g2 = new Group();
        Scene sc1 = new Scene(g1, 150, 100);
        Scene sc2 = new Scene(g2, 150, 100);

        Label t1 = new Label("This is panel 1");
        Button b1 = new Button("Go to panel 2");
        Label t2 = new Label("This is panel 2");
        Button b2 = new Button("Go to panel 1");
        t1.setTranslateY(15);
        t2.setTranslateY(15);
        b1.setTranslateY(50);
        b2.setTranslateY(50);
        g1.getChildren().addAll(t1, b1);
        g2.getChildren().addAll(t2, b2);

        b1.setOnMouseClicked(e -> { primaryStage.setScene(sc2); });
        b2.setOnMouseClicked(e -> { primaryStage.setScene(sc1); });

        primaryStage.setScene(sc1);
        primaryStage.show();
    }

如您所见,组g1和g2是两个不同的屏幕。每个包含一个文本和一个按钮,通过单击它,它将在它们之间切换。

我希望它可以帮到你

编辑: James_D让我注意到必须复制菜单以在每个屏幕上显示它,另一个解决方案是添加BorderPane作为场景的根节点,因此我们我们的菜单位于顶部,屏幕位于中心:

public void start(Stage primaryStage){
        BorderPane root = new BorderPane();
        Menu file = new Menu("File");
        MenuBar tb = new MenuBar(file);
        Group g1 = new Group();
        Group g2 = new Group();
        Scene sc1 = new Scene(root, 150, 100);
        root.setCenter(g1);
        root.setTop(tb);

        Label t1 = new Label("This is panel 1");
        Button b1 = new Button("Go to panel 2");
        Label t2 = new Label("This is panel 2");
        Button b2 = new Button("Go to panel 1");
        t1.setTranslateY(15);
        t2.setTranslateY(15);
        b1.setTranslateY(50);
        b2.setTranslateY(50);
        g1.getChildren().addAll(t1, b1);
        g2.getChildren().addAll(t2, b2);

        b1.setOnMouseClicked(e -> { root.setCenter(g2); });
        b2.setOnMouseClicked(e -> { root.setCenter(g1); });

        primaryStage.setScene(sc1);
        primaryStage.show();
    }