2016-07-28 12 views
0

Ok、JavaFXを使用してGUIを使用してテキストベースのゲームを作成しようとしています。私は実際のゲームのループに入る前に、すべてうまくいきました。いったん私はゲームループにコードを入れても、プログラムは起動しませんでした。エラーや例外なく実行されますが、ウィンドウは単にポップアップしません。ウィンドウを閉じると、IntelliJのすべてのコマンドラインに「Exit code 130で処理が完了しました」と表示されます。これは、ユーザーがCtrl + Cキーを押してプログラムが終了したことを意味しているようです。これはウィンドウがポップアップしていないためではありません。そのため、ユーザーはCtrl + Cを押してプログラムを終了することはできません。だから私の質問は、ウィンドウをポップアップすることを拒否せずに、ゲームループ(whileループ)で自分のプログラムを実行できるようにするには何ができるのだろうか。ここにある私のコードです:whileループを使用すると、JavaFXプログラムが起動しない

package sample; 
/** 
* Created by Angel on 7/26/16. 
*/ 

import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.VBox; 

public class Game { 

    // Inventory is a class that i made, 
    // but im sure it has nothing to do with my problem 
    private Inventory inv = new Inventory(); 
    private String levels; 

    private Scene scene; 
    private Label topText; 
    private Button btn1; 
    private Button btn2; 
    private Button btn3; 
    private boolean gameOn; 

    public void gameStart(){ 

     // Setting the GUI 

     // Setting up the window 
     VBox window = new VBox(210); 

     // setting up the top text holder. 
     HBox textHolder = new HBox(); 
     textHolder.setAlignment(Pos.CENTER); 

     // setting up the label 
     topText = new Label(); 
     topText.setText("You in a dark room, what do you do?"); 

     // setting up the button holder 
     HBox buttonHolder = new HBox(50); 
     buttonHolder.setAlignment(Pos.CENTER); 

     // setting up the buttons 
     btn1 = new Button(); 
     btn1.setPrefWidth(260); 
     btn1.setPrefHeight(30); 
     btn1.getStyleClass().add("gameButtons"); 
     btn1.setText("1"); 

     btn2 = new Button(); 
     btn2.setPrefWidth(260); 
     btn2.setPrefHeight(30); 
     btn2.getStyleClass().add("gameButtons"); 
     btn2.setText("2"); 

     btn3 = new Button(); 
     btn3.setPrefWidth(260); 
     btn3.setPrefHeight(30); 
     btn3.getStyleClass().add("gameButtons"); 
     btn3.setText("3"); 


     // finalizing the gui, by putting it all together 
     textHolder.getChildren().add(topText); 
     buttonHolder.getChildren().addAll(btn1, btn2, btn3); 
     window.getChildren().addAll(textHolder, buttonHolder); 

     // setting up the scene 
     scene = new Scene(window, 800, 600); 

     //adding the css script 
     // adding css script 
     scene.getStylesheets().add(this.getClass().getResource("game.css").toExternalForm()); 

     // the game loop. 

     levels = "Storyline"; 
     gameOn = true; 
     while(gameOn) { 
      switch (levels) { 
       case "Storyline": 
        btn1.setText("search around"); 
        btn2.setText("turn the light on"); 
        btn3.setText("stand in fear"); 

        btn2.setOnAction(e -> levels = "level1"); 
        break; 
       case "level1": 
        topText.setText("You turned the light on"); 
        break; 
      } 
     } 

    } 

    public Scene getScene(){ 
     return scene; 
    } 

} 
+0

なぜテキストを絶えず設定する無限ループを使用していますか? –

+0

ああ私の神様、私はそれをやっていることに気づいていませんでした。他の方法はありますか?私は他の方法でそれをする方法を知らない...ループなしでそれを書いて間違っているだろうか?または非従来の方法ですか? switch文を使用しようとしています。ループを使用せずにswitch文をもう一度実行して実行する方法はありますか?@krzyk –

+1

@AngelGarciaはメソッドとオブジェクトを使用します。 – SomeJavaGuy

答えて

1

これはゲームループすべきではありません。ボタンをクリックするとイベントがトリガーされます。それはそこで処理されるべきです。ボタンのテキストを何度も更新する必要はありません。これは現在行っていることです。

ここでループを実行すると、アプリケーションのスレッド(ユーザーのやりとりを再描画して処理するスレッド)がブロックされ、そのタスクを実行できなくなります。

屈折ベースイベント、すなわち

ユーザー操作(ボタンのクリック)を動作するようにあなたのコードは、UIの更新(状態の変化やUIの単一の更新)をトリガします。

など。

public class Game { 

    ... 

    public void gameStart(){ 

     ... 

     // setting up the scene 
     scene = new Scene(window, 800, 600); 

     // adding css 
     scene.getStylesheets().add(this.getClass().getResource("game.css").toExternalForm()); 

     setLevel("Storyline"); 
    } 

    public void setLevel(String newLevel) { 
     // TODO: integrate gameOn value 
     if (newLevel != null && !newLevel.equals(levels)) { 
       levels = newLevel; 
       switch (levels) { 
       case "Storyline": 
        btn1.setText("search around"); 
        btn2.setText("turn the light on"); 
        btn3.setText("stand in fear"); 

        // user interaction triggers setting the level 
        btn2.setOnAction(e -> setLevel("level1")); 
        break; 
       case "level1": 
        topText.setText("You turned the light on"); 
        break; 
      } 
     } 
    } 

    ... 

} 

追加勧告:インタフェースを実装するインスタンスとして、それを表現する、Stringとしてのレベルを表すものではありません。このような何か

public interface Level { 
    // do updates for level start on game 
    void updateGameLevelStart(Game game); 

    // cleanup code e.g. unregistering event handlers... 
    void updateGameLevelEnd(Game game); 
} 

これはあなたがLevellevelsの種類を変更することができるようになりますそして、更新を簡素化:

public void setLevel(Level newLevel) { 
    if (!Objects.equals(levels, newLevel)) { 
     if (levels != null) { 
       // cleanup old level 
       levels.updateGameLevelEnd(this); 
     } 
     levels = newLevel; 
     if (newLevel != null) { 
       // start new level 
       newLevel.updateGameLevelStart(this); 
     } 
    } 
} 

これはもちろんの関連部分を作るためにあなたを必要としますLevel実装にアクセス可能なUI

関連する問題