This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
z:code:gamemanager [2008/05/25 14:55] cabalistic |
z:code:gamemanager [2015/08/23 13:59] (current) |
||
---|---|---|---|
Line 19: | Line 19: | ||
===== Main Loop, Game States und GUI-Verwaltung ===== | ===== Main Loop, Game States und GUI-Verwaltung ===== | ||
Nun kommen wir auch schon gleich zu einem ersten mehr oder minder großen Problem der aktuellen Codestruktur und damit also einem der ersten Zwischenschritte fürs Refactoring. Nachdem unser Spiel sich jetzt initialisiert hat und für den Spieler der Ladebildschirm gerade fertiggeworden ist, geht's in die Main Loop des Spiels (die Funktion run). Die hält zunächst die verstrichene Zeit in Sekunden im Auge und führt ein paar grundsätzlich nötige Updates pro Schleifendurchgang durch, im Moment ist das das Update von Input- und SoundManager, | Nun kommen wir auch schon gleich zu einem ersten mehr oder minder großen Problem der aktuellen Codestruktur und damit also einem der ersten Zwischenschritte fürs Refactoring. Nachdem unser Spiel sich jetzt initialisiert hat und für den Spieler der Ladebildschirm gerade fertiggeworden ist, geht's in die Main Loop des Spiels (die Funktion run). Die hält zunächst die verstrichene Zeit in Sekunden im Auge und führt ein paar grundsätzlich nötige Updates pro Schleifendurchgang durch, im Moment ist das das Update von Input- und SoundManager, | ||
+ | Es gibt prinzipiell zwei Grundzustände, | ||
+ | Gleichermaßen würden diese GameStates Kontrolle über die GUI bekommen; wenn ihr etwas in den Source Files browst, wird euch auffallen, dass es eine Reihe von SMGUIxxx-Dateien gibt. Ich hatte hier ursprünglich versucht, die GUI-Verwaltung ein bisschen wie Desktop-GUIs zu machen, bei der man meistens für einen Dialog eine separate Klasse hat, aber das funktioniert hier so nicht. Wie man sieht, haben viele dieser Dateien nämlich fast keinen Code und sind im Großen und Ganzen überflüssig, | ||
+ | |||
+ | Wenn ihr eure Arbeit am Code beginnen wollt, würde ich sagen, dass das ein guter Startpunkt wäre. Diese Restrukturierung von GameManager ist dringend nötig und zwingt euch dazu, etwas im Code querzulesen, | ||
+ | |||
+ | ===== Accessor-Funktionen ===== | ||
+ | Kommen wir nun zum zweiten Problem, den Accessor-Funktionen. Die Idee ist prinzipiell folgende, GameManager verwaltet einige Objekte, auf die anderer Code zugreifen können muss. Nehmen wir als Beispiel das Scenario (auch wenn das, wie oben erwähnt, künftig von einem GameState verwaltet werden sollte). Das Scenario ist das Kernstück eines laufenden Spiels, es verwaltet Einheiten, Terrain etc., kurz eigentlich den allgemeinen Spielablauf. Da andere Einheiten z. B. gelegentlich auf andere Einheiten zugreifen müssen, brauchen sie Zugriff auf das Scenario. Deswegen bietet GameManager momentan eine Accessor-Funktion für Scenario. Natürlich könnte man alternativ allen Objekten, die Zugriff auf das Scenario brauchen, einen Pointer zum Scenario bei der Konstruktion übergeben, aber das ist repetitiv und äußerst mühsam, also ist ein Accessor schon keine schlechte Wahl. | ||
+ | Das Problem ist aber, dass es einerseits Unter-Accessoren gibt. Scenario z. B. wiederum besitzt ein Terrain-Objekt, | ||
+ | Die Lösung ist zum Glück nicht so kompliziert und besteht einfach darin, Klassen wie Scenario auch als Ogre-Singletons zu implementieren. Dadurch werden sie nach wie vor von ihrem Besitzer erzeugt und gelöscht, aber sie erhalten automatisch einen Accessor, der in ihrer eigenen Include-Datei sitzt, z. B. also Terrain:: | ||
+ | Manche Accessor-Funktionen kann man allerdings so nicht ersetzen. getSceneManager von GameManager muss man z. B. einfach hinnehmen, allerdings wird der SceneManager auch nicht so oft gebraucht, insofern ist das kein echtes Problem. |