2016-06-17 29 views
0

私はJavaFXを初めて使いました.JavaFXを使って簡単な2Dゲームを作りたかったのです。私はこれをよく読んだJavaFX game tutorialを読んだ。私は次の構造の簡単なゲームを書いた:複数の画面を持つJavaFXゲーム

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

そして私は結果にとても満足していた。ゲームにはメニューなどはなく、ゲーム自体は1つの画面しかありませんでした。問題は、アプリケーションを拡張していくつかの異なるゲームを追加したいということです。つまり、いくつかの異なる画面(メインメニューと各ゲーム)を処理し、それらの間を切り替える必要があります。私はインターネットで助けを探しましたが、私が見つけたのは、実際に使っていないFXMLの例でした。

私の質問は次のとおりです。今私が持っている構造を考えれば、他のいくつかの画面を簡単に作成し、それらの間を切り替えるにはどうすればいいですか?

+0

この質問はあまりにも広すぎるようです:どの特定の部分があなたと付き合っていますか?メニューを作成しますか?メニュー項目を選択するユーザーに反応しますか?レイアウトをしていますか?アプリケーション全体を構造化しますか?あなたはたぶん何かを試して、あなたが立ち往生したときに特定の質問を投稿する必要があります。まず、 'MenuBar'(または' ToolBar')を上にして 'BorderPane'を使うことを考えてみましょう。ユーザーがゲームを選択したときに中心を変更します。各ゲームのコードを別のクラスに組み込む:おそらく、アプリケーションを構造化するための私の答えをhttp://stackoverflow.com/questions/32464698/で見てください。 –

+0

私が持っている正確な問題は、これまでゲームのメインループとして働いていたAnimationTimerのハンドルメソッドにどのように取り組むべきか分かりません。これはスプライトの更新、衝突のチェックなどです。これまでのところ、1つのゲームはメソッドを入力する前にすべてを開始してから、アプリケーションを終了するまでそこにとどまりました。さて、私はこの方法の中から一つのゲームを「終了」し、別のゲームを選択するためにメインメニューを表示する方法を知らない。 – user3018717

+0

'AnimationTimer'は' stop() 'メソッドを持っています...そうでなければ、あなたは何をする必要があるか正確に説明したと思います。 –

答えて

0

なぜ異なるシーンを使用しないのですか?あなたが見ることができるように、グループG1とG2は、2つの異なる画面がある

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

: は、ここで私はちょうど作った小さな例です。それぞれにはテキストとボタンがあり、クリックするとその間に切り替わります。

私はそれがあなたの役に立てば幸い

EDIT: 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(); 
    } 
+0

異なるシーンを使用する場合、それぞれのメニューを複製する必要があります... –

+0

ああ、2番目の解決策は、シーンのルートを変更することです – Omar

+0

確かに同じ問題を抱えていますか? –

関連する問題