我是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的一些例子,我并没有真正使用它。
我的问题是:考虑到我现在拥有的结构,如何轻松创建其他几个屏幕并在它们之间切换?
答案 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();
}