Ich bin in einem Dilemma, wie bestimmte Motorkomponenten - wie Kamera und Benutzeroberfläche - wissen, wem sie folgen müssen, wessen Zustand und andere Attribute auf dem Bildschirm dargestellt werden sollen.
Wie erstellen Sie ein System, in dem die Kommunikation zwischen diesen Komponenten und den Entitäten stattfindet? Ich könnte eine separate Entität haben, die den Spieler repräsentiert, aber das scheint ein bisschen "hartcodiert" zu sein. Was ist, wenn ich die Kamera schwenken möchte? Was ist, wenn der Spieler beginnt, eine andere Entität zu kontrollieren?
Mit anderen Worten, wie abstrahiere ich die Datenquellen für Komponenten wie die Kamera und die Benutzeroberfläche, sodass es ihnen egal ist, welche Entität sie darstellen?
Ein Ereignissystem reicht für viele Fälle aus, aber dies ist besser geeignet, um Informationen zu verbreiten, die sich ändern oder "selten" generiert werden (wie der Tod des Spielers). Für so etwas wie den Zustand und die Position einer Entität - die in jedem Frame bekannt sein müssen - ist ein Ereignissystem nicht gut geeignet.
quelle
Antworten:
Die einfachste Lösung wäre, einen Elementzeiger auf ein Objekt wie Camera.Target oder UI.Subject zu behalten, das auf den Spielercharakter zeigt, aber bei Bedarf auf andere Objekte umgeleitet (oder auf NULL gesetzt) werden kann.
Wenn der Spieler den Charakter ändert, senden Sie ein Ereignis, um die Zielvariable der Kamera und das Thema der Benutzeroberfläche zu ändern. Wenn Sie die Kamera schwenken möchten, überschreiben Sie das "Ziel" -Verhalten und stellen Sie eine manuelle Bewegung ein.
quelle
ITarget
Schnittstelle erstellt, die im Grunde nur X / Y-Variablen definiert (mein Spiel ist 2D). MeinePlayer
Klasse implementiert diese Schnittstelle und aktualisiert die Werte mit ihren X / Y-Koordinaten. DannCamera
hat die eineTarget
Eigenschaft vom TypITarget
. JederUpdate
, derCamera
überprüft , ob es sich um eine hatTarget
und aktualisiert sich entsprechend, sonst ist es etwas anderes (in meinem Fall ist es frei und bewegt sich auf Tastendrücke basieren, aber Sie können tun , was Sie wollen).Ich finde, dass der einfachste Weg, dies zu tun, darin besteht, mich nicht darauf zu beschränken, nur eine einzige Kamera zu haben.
Stattdessen sind meine Spielwelten voller Kameras, Dutzende oder Hunderte von ihnen. Jeder potenziell steuerbare Charakter hat eine Kamera, jede Zwischensequenz hat eine Kamera, oft hat eine einzelne Entität mehrere verschiedene Kameras für verschiedene Spieleraktivitäten. (Kampfbewegungen, Leerlauf, Sprint usw.). Jede Kamera erhält beim Erstellen ihr Ziel, und dieses Ziel bleibt (in der Regel) während der gesamten Lebensdauer der Kamera konstant.
Das Problem lautet nun nicht "Woher weiß die Kamera, welchem Zeichen sie folgt", sondern "Woher weiß der Renderer, welche der Kameras in der Szene sie gerade zum Rendern verwenden soll". Ich verwende dafür eine Kameramanager-Klasse, die alle Kameras in der Szene kennt und von einer zur anderen mischen kann, wie es durch Ereignisse angewiesen ist, die sie von der Spielelogik empfängt.
quelle
Spieler unterscheiden sich wahrscheinlich genug von anderen Objekten oder Entitäten, dass sie ihre eigene Klasse haben. Für viele Spiele ist es absolut legitim, ein globales Spielerobjekt zu haben, das in der gesamten Engine verfügbar ist und immer den Spieler repräsentiert, und jedes System, das über den Spieler Bescheid wissen muss, kann mit dieser Klasse sprechen. Dies kann sauberer und einfacher sein, als überall einen Zeiger herumzugeben.
Wenn Ihr Spiel über ein Netzwerk im Mehrspielermodus gespielt wird, kann dies dennoch sinnvoll sein, da es einen großen Unterschied zwischen dem lokalen und dem Remote-Spieler gibt. Wenn Sie den lokalen Mehrspielermodus mit zwei Controllern unterstützen, benötigen Sie mehrere Spielerobjekte und die damit verbundene Übergabe von Zeigern.
quelle