Es stellt sich die Frage, wie ich am Ende eines Spiels in der Game-Loop am geschicktesten diese neu starte, wenn der Benutzer ein weiteres Spiel wünscht.
Der Ablauf ist grob der folgende:
Irgendwo beim Start des Programms:
gameLoop = new GameLoop(...parameter...);
Thread thread = new Thread(gameLoop);
thread.start();
}
In GameLoop
:
public void run() {
[...]
while (running) {
[...]
if (... Bedingung für Spielende ...) {
running = false;
gameOver();
}
}
}
in gameOver()
stellt sich dann die Frage, wie denn - so der Benutzer es wünscht - neu gestartet werden soll. Zunächst stellen wir fest:
[ol]
[li] Der Aufruf von gameOver()
findet natürlich in dem Thread der Game-Loop statt.
[/li][li] Nach Beenden von gameOver()
wird run()
beendet (weil running
auf false
gesetzt wurde) und damit endet auch der Thread, wenn man in ihm nichts mehr tut.
[/li][/ol]
Mir fallen da nun folgende Möglichkeiten ein:
[ol]
[li] Einfach run()
neu aufrufen. Wir sind ja noch in dem Extrathread für die Game-Loop. Initialisierungen für ein neues Spiel finden zu Beginn von run()
statt.
[/li][li] Einen neuen Thread starten, analog zu dem, was beim Start des Programms gemacht wurde. Wirkt irgendwie unfein, wenn aus der Game-Loop eine Game-Loop eine Game-Loop eine Game-Loop gestartet wird. Andererseits laufen die alten Game-Loops ja aus und die Threads werden beendet. Problem hier: Will die Logik die Game-Loop beenden (weil der Benutzer das Fenster schließt o.ä,), wird auf einem alten GameLoop-Objekt Edit: Stimmt nicht, das gilt ja nur, falls neue GameLoop-Objekte erzeugt würden. Das muss ja aber nicht sein, man könnte immer wieder das gleiche GameLoop-Objekt starten.quit()
(setzt running
auf false
) aufgerufen, entweder müsste ich dann das neue irgendwie übergeben, oder die Aufforderung zum Beenden durchreichen (wodurch all die alten Game-Loop-Threads also doch noch leben müssten), das ist alles irgendwie unpraktisch.
[/li][li] Einen Rückgabewert generieren, aus dem in run()
entnommen wird, ob running wirklich auf false gesetzt werden sollte. Eine Initialisierung für den neuen Spielbeginn müsste dann natürlich erfolgen.
[/li][li] running
nicht in run()
auf false
setzten, sondern in gameOver()
(oder eben auch nicht). Eine Initialisierung für den neuen Spielbeginn müsste dann natürlich hier ebenfalls erfolgen.
[/li][/ol]
Gibt es da eventuell klare Designregeln, welches dieser (oder noch anderer) Vorgehen da am geeignetsten ist? Oder scheidet eines oder mehrere aus Gründen aus, die mir gerade nicht ersichtlich sind?