Ich hatte eine Frage zur Spielarchitektur: Wie lassen sich verschiedene Komponenten am besten miteinander kommunizieren?
Ich entschuldige mich wirklich, wenn diese Frage bereits eine Million Mal gestellt wurde, aber ich kann mit genau den Informationen, nach denen ich suche, nichts finden.
Ich habe versucht, ein Spiel von Grund auf neu aufzubauen (C ++, wenn es darauf ankommt) und habe einige Open-Source-Spielesoftware als Inspiration betrachtet (Super Maryo Chronicles, OpenTTD und andere). Ich stelle fest, dass in vielen dieser Spiele-Designs überall globale Instanzen und / oder Singletons verwendet werden (z. B. für Render-Warteschlangen, Entity-Manager, Videomanager usw.). Ich versuche, globale Instanzen und Singletons zu vermeiden und eine Engine zu bauen, die so locker wie möglich gekoppelt ist, aber ich stoße auf einige Hindernisse, die meiner Unerfahrenheit im effektiven Design geschuldet sind. (Ein Teil der Motivation für dieses Projekt ist es, dies anzusprechen :))
Ich habe ein Design erstellt, in dem ich ein GameCore
Hauptobjekt habe, dessen Mitglieder den globalen Instanzen entsprechen, die ich in anderen Projekten sehe (dh, es hat einen Eingabemanager, einen Videomanager, ein GameStage
Objekt, das alle Entitäten und das Spiel steuert für welche Bühne gerade geladen ist, etc). Das Problem ist, dass es GameCore
für verschiedene Komponenten nicht einfach ist, miteinander zu kommunizieren , da sich alles im Objekt befindet.
Wenn beispielsweise eine Komponente des Spiels mit einer anderen Komponente kommunizieren muss (dh ein feindliches Objekt möchte sich selbst in die Render-Warteschlange einfügen, die in der Render-Phase gezeichnet werden soll), spricht Super Maryo Chronicles nur mit dem globale Instanz.
Für mich muss ich meine Spielobjekte relevante Informationen an das GameCore
Objekt zurückgeben lassen, damit das GameCore
Objekt diese Informationen an die anderen Komponenten des Systems weitergeben kann, die sie benötigen (dh für die obige Situation jedes feindliche Objekt) ihre Renderinformationen an das GameStage
Objekt zurückgeben, das sie alle sammelt und an das Objekt zurückgibt GameCore
, das sie wiederum an den Videomanager zum Rendern weitergibt). Das fühlt sich an wie ein wirklich schreckliches Design, und ich habe versucht, eine Lösung dafür zu finden. Meine Gedanken zu möglichen Designs:
- Globale Instanzen (Design von Super Maryo Chronicles, OpenTTD usw.)
- Das
GameCore
Objekt als Vermittler fungieren zu lassen, über den alle Objekte kommunizieren (aktuelles Design wie oben beschrieben) - Geben Sie den Komponenten Zeiger auf alle anderen Komponenten, mit denen sie sprechen müssen (dh im obigen Maryo-Beispiel hätte die feindliche Klasse einen Zeiger auf das Videoobjekt, mit dem sie sprechen muss).
- Unterteilen Sie das Spiel in Subsysteme. Verfügen Sie beispielsweise über Managerobjekte in dem
GameCore
Objekt, die die Kommunikation zwischen Objekten in ihrem Subsystem verwalten - (Andere Optionen? ....)
Ich stelle mir die obige Option 4 als die beste Lösung vor, aber ich habe einige Probleme beim Entwerfen ... vielleicht, weil ich über die Entwürfe nachgedacht habe, die Globale verwenden. Anscheinend nehme ich das gleiche Problem, das in meinem aktuellen Design besteht, und repliziere es in jedem Subsystem, nur in kleinerem Maßstab. Beispielsweise ist das GameStage
oben beschriebene Objekt ein Versuch, aber das GameCore
Objekt ist immer noch in den Prozess involviert.
Kann hier jemand einen Konstruktionsratschlag geben?
Vielen Dank!