# Levelverknüpfungen



## House (1. Jan 2009)

Ich habe eine Klasse Level programmiert und jedes Level in diesem Spiel soll letztendlich eine Instanz dieser sein. Jetzt frage ich mich bloß wie ich am effektivsten und übersichtlichsten all diese Levels verknüpfen kann, da diese zusammenhängen (man kann eben von level_1 in level_2 gelangen und so weiter).

Die Problematik ist diese: Die Referenzen der einzelnen Levels sind erst zur Laufzeit bekannt, ich kann auch nicht mit dem Entwurfsmuster Singleton (über die Methode getInstance()) nachhelfen, alle Spielorte sollen letztendlich von dieser einen Klasse stammen und es können sehr komplexe, unübersichtliche Referenzkonstrukte entstehen (die vielleicht sogar noch uneffizienten Code produzieren). Um mein Problem besser verstehen zu können, habe ich hier noch eine Beispielgrafik: http://xs.to/xs.php?h=xs135&d=09014&f=konstruktion451.jpg

Meine Frage lautet nun: Wie bekomme ich das Problem am besten in den Griff? Wie verknüpfe ich all die Level(-referenzen) am besten? Wie setzt ihr eure Levelverknüpfungen in euren Spielen um? Ich wäre für Hilfe sehr dankbar. Da ich noch lange kein Java- und erst recht kein Spieleentwicklerprofi bin, bin ich sehr auf einige lehrreiche Antworten gespannt.


----------



## Tobias (1. Jan 2009)

Ich würde der Klasse Level eine Methode getNextLevel() verpassen, die die zur Entscheidung notwendigen Variablen übergeben kriegt (also die erreichte Punktzahl oder so) und in Abhängigkeit davon das passende Level zurückgibt. Die meisten Level in deiner Grafik haben ja eh nur einen Nachfolger, für die anderen sollten die Entscheidungskriterien klar definiert sein.


----------



## mahe (1. Jan 2009)

Ich würd sowas wie einen Spiel-Manager bauen der genau weiß wie die Levels zusammenhängen.
Wird ein Level verlassen, meldet dieser dies dem Spiel-Manager (mit allen nötigen Informationen) und der startet dann den nächsten Level.


----------



## Marco13 (1. Jan 2009)

Das bild ist ein simpler gerichteter Graph :roll: Wie und wo der aufgebaut wird oder werden kann, weiß ... naja, vielleicht auch derjenige, der entschiedet, welches Level nach Level 2 kommt.........


----------



## House (1. Jan 2009)

@Tobias:
Ja, das klingt interessant. Und du würdest dann die möglichen nächsten Level z.B. in einem Array per Konstruktor oder setNextLevel() Methode dem Objekt übergeben?

@mahe:
Das Konzept eines Spielmanagers wär mir wohl so schnell nicht eingefallen. Klingt ebenfalls interessant. Hast du so etwas schon einmal programmiert und evtl. ein Beispiel zur Verfügung? Ich weiß zwar was du meinst, aber ich würde mir dennoch ansehen wie so etwas schon mal jemand anderes programmiert hat.

@Marco13:
Gilt das ("ein gerichteter Graph") nicht für alle Levelkonstruktionen und Levelverknüpfungen? Wobei die Beispielgrafik von mir eben nur ein Beispiel ist, mehr nicht. Um eben die Problematik visuell noch zu verdeutlichen. Aber was wolltest du nun genau mit deinem Beitrag aussagen?



Schon mal danke an euch. Freut mich.


----------



## mahe (1. Jan 2009)

Beispiel hab ich so auf die schnelle leider nicht zur Verfügung.

Ich habe es mal folgendermaßen gelöst:
Es gab ein Singleton. Sämtliche Paint- und Interaktions-Aufrufe gingen an dieses.
War gerade ein Level (bei mir waren es eher Programm-Stadien) geladen, wurde diese Aufrufe an den Level weitergeleitet. Die Levels wussten selbst, wann ein anderes Level geladen werden sollte. Dies teilten sie dem Singleton mit (S.getInstance().changeLevel(x) oder so ähnlich). Das Singleton leitete von nun an einfach die Aufrufe an den anderen Level weiter.

Dies hat sich eigentlich sehr gut bewährt. Z.B. kann man sehr einfach Animationen oder irgendetwas anderes zwischen den Levels einbauen indem das Singleton die Aufrufe einfach eine Zeit lang selbst bedient.


Vielleicht wäre es aber hübscher wenn Du einen Levelmanager selbst von der Level-Klasse ableitest. Dieser würde dann je nach Zustand die Aufrufe an einen echten Level weiterleiten (ähnlich dem Proxy-Muster). Dem Verwender des Levels wäre es dann egal welches Level gerade wirklich geladen ist.

(übrigens habe ich keine Ahnung welche Geschlechter "Level" und "Singleton" haben und deshalb ist wahrscheinlich jeder zweite Artikel falsch ...)


----------



## Marco13 (1. Jan 2009)

Es könnten auch ungerichtete Graphen sein. Also, wenn man das wirklich nur als Graphen sieht, stellt sich eben die Frage, WENN und WANN entscheiden kann, ob man von Level 2 nach Level 3 oder 5 kommt.  Weiß Level 2 das schon zu Anfang, wenn es erstellt wird? Was spricht dagegen, dass jedes Level seine Nachfolger kennt?


----------



## House (2. Jan 2009)

Marco13 hat gesagt.:
			
		

> Was spricht dagegen, dass jedes Level seine Nachfolger kennt?



Dagegen spricht nichts. Die Frage ist ja eben, wie man die ganze Sache am besten in den Griff bekommt, wenn bekannt ist wie die Level verknüpft werden sollen. Ich habe da zwar schon meine eigenen Ideen, aber ich wollte einfach von erfahreneren Programmierern ein paar Ideen und Konzepte hören. Gibt ja noch genug für mich zu lernen.


----------



## Marco13 (2. Jan 2009)

Naja, dass die Level ihre Nachfolger kennen ist erstmal die nächstliegende Lösung, auf Basis des bisher geposteten. In bestimmten Zusammenhängen könnte das auch nachteilhaft sein - z.B. wenn ein Level je nach "Spielzusammenhang" unterschiedliche Nachfolger haben kann oder so ... aber ... da du sowas nicht geschrieben hast.... Wird es wohl nicht so sein...


----------



## House (2. Jan 2009)

Marco13 hat gesagt.:
			
		

> Naja, dass die Level ihre Nachfolger kennen ist erstmal die nächstliegende Lösung, auf Basis des bisher geposteten. In bestimmten Zusammenhängen könnte das auch nachteilhaft sein - z.B. wenn ein Level je nach "Spielzusammenhang" unterschiedliche Nachfolger haben kann oder so ... aber ... da du sowas nicht geschrieben hast.... Wird es wohl nicht so sein...



Die Level bzw. Nachfolger sind schon vorher bekannt. Es ist also nicht so, dass die erst im Spielverlauf festgelegt werden sollen.


----------



## Tobias (2. Jan 2009)

Na dann braucht es doch für jedes Level nur eine Instanzvariable, in der das nächste Level gespeichert wird. Die von mir vorgeschlagen getNextLevel() liefert dann genau dieses Level zurück. Gibt es mehr als ein nächstes Level, muß sie dafür eben irgendeine Entscheidung treffen.


----------



## House (3. Jan 2009)

Ja, dein Vorschlag hat mir auch sehr gut gefallen. Danke nochmal für all die Vorschläge und Hilfe.


----------

