JavaFX jeu avec plusieurs écrans


Je suis nouveau sur JavaFX et je voulais créer un jeu 2D simple en utilisant JavaFX. J'ai lu ce Tutoriel de jeu JavaFX que j'ai trouvé très utile. J'ai écrit un jeu simple avec la structure suivante:

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();
}
}

Et j'étais très content du résultat. Il n'y avait pas de menu, etc. dans le jeu, un seul écran avec le jeu lui-même. Le problème est que je veux maintenant étendre l'application et y inclure quelques jeux différents, ce qui signifie que j'ai en quelque sorte besoin de gérer quelques jeux différents écrans (le menu principal et chacun des jeux) et basculer entre eux. J'ai cherché de l'aide sur Internet, mais tout ce que j'ai trouvé était quelques exemples avec FXML que je n'utilise pas vraiment.

Ma question est: comment puis-je facilement créer quelques autres écrans et basculer entre eux, étant donné la structure que j'ai maintenant?

Author: user3018717, 2016-06-17

1 answers

Pourquoi ne pas utiliser différentes scènes ? Voici un petit exemple que je viens de faire:

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();
    }

Comme vous pouvez le voir, les groupes g1 et g2 sont deux écrans différents. Chacun contient un texte et un bouton, en cliquant dessus, il va basculer entre eux.

J'espère que cela vous aide

EDIT: James_D m'a fait remarquer que le menu devrait être répliqué pour l'avoir sur chaque écran, l'autre solution est d'ajouter une BorderPane le nœud racine de la scène, ce que nous avons toujours le menu en haut et notre écran au centre:

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();
    }
 0
Author: Omar, 2016-06-17 19:15:22