Frage von gut4fr5g4, 35

JavaFX Anwendung restarten?

Wie kann ich mein JavaFX Snake-game restarten?

Ich habe schon vor längerer Zeit Snake geschrieben und wollte es nun upgraden, dass man wenn man stirbt von neu startet, was ich aber nicht hinkriege

Hier der Code:

Was muss ich machen, dass die Snake neu spawnt bzw dass alle create-methoden (Siehe "Game"-Klasse) neu aufgerufen werden, denn wenn ich die neu aufrufe passiert nichts...

Hier der Code: http://hastebin.com/xigidebuqa.java

Expertenantwort
von KnusperPudding, Community-Experte für Java, 17

Kommt ganz drauf an, wie du es gestalten willst.

Aktuell ist es so, sobald du eine Kollision feststellst, beendest du die komplette JVM mit System.exit(0);

Du hättest die Möglichkeit, entweder alles in deiner Instanz zurück zu setzen und den Ausgangspunkt wieder herzustellen.

Oder du verwirfst die ganze Instanz beim Gameover. 

Als 'Schnelle' Lösung wäre mein Tipp: Erstelle ein "Haupt-Menü" Mit einem Button "Spiel-Start". - Dies wird über die Stage der start Methode angezeigt.

Auf den Button würde ich einen Eventhandler setzen, welcher eine neue Stage erstellt und dann dein Spiel startet.

Damit dein System.exit(0); nicht alles beendet, verwende stattdessen ein 

stage.close();

Nachdem in der Instanz einige Threads laufen, bin ich mir nicht sicher in wie weit diese vom Garbage-Collector aufgeräumt werden, oder ob man hier manuell noch einschreiten muss.

Kommentar von gut4fr5g4 ,

kannst du das am code machen, ich versteh nicht was du meinst

Kommentar von KnusperPudding ,

Schritt 1: Schmeiß das hier raus:

private static final Spielfeld OBJEKT_1 = new Spielfeld(); //Instanz von der Klasse Spielfeld wird erstellt
private static final Snake OBJEKT_2 = new Snake(); //Instanz von der Klasse Move wird erstellt

Anstatt hier direkt dein Spiel zu starten:

 public void start(Stage stage) throws Exception { //start-Methode 
OBJEKT_1.setStage(stage); //setter für Stage
OBJEKT_1.createField(); //Methode zum Erstellen des Spielfeldes
OBJEKT_2.setStage(stage); //setter für Stage
OBJEKT_2.move(OBJEKT_1); //Methode zum Bewegen der Snake
}

Erstellst du einfach einen Button, welchen du an die Stage anfügst. Dieser bekommt einen EventHandler, der beim Klick eine neue Stage erstellt, und zwar mit deinem Spiel.

Stage stage = new Stage();
Spielfeld spielfeld = new Spielfeld();
Snake snake = new Snake();

spielfeld.setStage(stage);
spielfeld.createField();
snake.setStage(stage);
snake.move(spielfeld);

Anstatt System.exit(0); einfach stage.close(); verwenden (Wird jedoch ein Platform.runlater notwendig sein, dass das funktioniert)

Kommentar von gut4fr5g4 ,

kannst du das pls an meinem code machen, der ist ja oben, wäre echt geil

Kommentar von gut4fr5g4 ,

"Du hättest die Möglichkeit, entweder alles in deiner Instanz zurück zu setzen und den Ausgangspunkt wieder herzustellen."

Wie mache ich das?

Kommentar von KnusperPudding ,

Indem du entsprechende Methoden einbaust, welche das für dich übernehmen. 

Mal als Beispiel deklarierst du das String-Attribut: taste hier und initialisierst es mit "null":

private String taste = "null";

entsprechend sollte deine Methode, nachdem diese Variable eben mehrfach geändert wird, diese Variable (und natürlich noch weitere) auf ihren

ursprünglichen Wert

zurück setzen.

Aber das allein wird nicht reichen, denn du hast ja noch Threads in deiner Anwendung wie TimerTask. Als auch Listener/Eventhandler die angehängt werden, was man sauber Beenden und/oder Entfernen sollte.

Antwort
von Madwrgt87, 21

Ich würde dir empfehlen, dass, wenn der Spieler das Spiel verloren hat, dann direkt ein Fenster oder Button erscheint mit der Funktion, wo ein neues Spiel startet. Je nachdem, wenn dein Snakespiel ggf. ohnehin keinen Spielstand speichert, ist das bereits ausreichend!

LG

Kommentar von gut4fr5g4 ,

Ja das ist mir schon bewusst, nur WIE mache ich das mit dem restarten, das muss ja irgendwie IM programm sein ohne dass ich das jedes mal neustarten muss

LG 

Keine passende Antwort gefunden?

Fragen Sie die Community