2016-07-28 14 views
0

Ok, also versuche ich, ein Text-basiertes Spiel mit einer GUI mit JavaFX zu machen. Alles funktionierte gut, bevor ich die eigentliche Spielschleife einsetzte. Obwohl ich einmal in die Spielschleife programmiert habe, würde das Programm nicht starten. Es würde ohne Fehler oder Ausnahmen laufen, aber das Fenster würde einfach nicht auftauchen. Wenn ich das Fenster schließe, sagt die gesamte Befehlszeile in IntelliJ "Prozess beendet mit Beendigungscode 130" was bedeutet, dass das Programm geschlossen wurde, weil der Benutzer Strg + C drückt. Dies ist jedoch nicht der Fall, da das Fenster nicht einmal geöffnet wird. Daher kann kein Benutzer auf Strg + C klicken, um das Programm zu beenden. Meine Frage ist also, was kann ich tun, um mein Programm mit einer Game-Loop (While-Schleife) ausführen zu können, ohne dass sich das Fenster nicht öffnet. Hier ist mein Code:JavaFX-Programm nicht gestartet, wenn ich eine While-Schleife verwenden

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

Warum verwenden Sie eine Endlosschleife, die nur Texte ständig setzt? –

+0

Oh mein Gott, ich wusste nicht einmal, dass ich das mache. Gibt es einen anderen Weg? Ich weiß nicht, wie ich es anders machen soll ... wäre es nicht falsch, ohne eine Schleife zu schreiben? oder der unkonventionelle Weg? Ich versuche eine switch-Anweisung zu verwenden. Gibt es eine andere Möglichkeit, zurück zu gehen und die switch-Anweisung erneut durchlaufen, ohne eine Schleife zu verwenden @ krzyk –

+1

@AngelGarcia Methoden und Objekte verwenden. – SomeJavaGuy

Antwort

1

Dies ist kein Spiel Schleife sein sollte. Der Klick auf die Schaltfläche löst ein Ereignis aus. Es sollte dort behandelt werden. Es ist nicht notwendig, Knopftexte immer wieder zu aktualisieren, was Sie gerade tun.

Indem Sie dort eine Schleife ausführen, blockieren Sie den Anwendungsthread. Dies ist der Thread, der für das Neuzeichnen und Behandeln der Benutzerinteraktion verantwortlich ist, was es unmöglich macht, seine Aufgabe zu erledigen.

Refraktor Code Ereignis arbeiten basierend, das heißt

Benutzerinteraktion (Tastenklick) löst ui-Update (eine Änderung des Staates und ein einzelnes Update der Benutzeroberfläche).

z. so etwas wie dieses:

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

    ... 

} 

Zusätzliche Empfehlung: Sie stellen den Pegel nicht als String, repräsentieren sie als Beispiel eine Schnittstelle implementiert:

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

würde dies ermöglichen es Ihnen, die Art der levels zu Level ändern und vereinfachen Sie die Updates:

Dies würde natürlich erfordern, dass Sie die relevanten Teile davon machen Die UI zugänglich für die Level Implementierungen.