Woher weiß die Kamera / Benutzeroberfläche, wer der Player ist?


7

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.


Und empfängt die Kamera Eingaben? Oder der Spielercharakter oder ein abstrakter Controller. Die Kamera folgt also dem Spieler, den der Cinput-Controller bewegt?
Verlangsamte

Antworten:


10

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.


+1 Dies ähnelt dem, was ich benutze. Ich habe eine ITargetSchnittstelle erstellt, die im Grunde nur X / Y-Variablen definiert (mein Spiel ist 2D). Meine PlayerKlasse implementiert diese Schnittstelle und aktualisiert die Werte mit ihren X / Y-Koordinaten. Dann Camerahat die eine TargetEigenschaft vom Typ ITarget. Jeder Update, der Cameraüberprüft , ob es sich um eine hat Targetund 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).
Richard Marskell - Drackir

2

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.


Klingt ein bisschen übertrieben? Könnten Sie stattdessen nicht einfach das Verhalten basierend auf Basistypen definieren? (Zwischensequenz, Kopf usw.)
verzögert

Versteh mich nicht falsch; Die Kameras haben Standardverhalten. Ich befürworte nicht separate Implementierungen für jede Instanz einer Kamera in der Szene! Es ist nur sehr nützlich, wenn jede potenzielle Kamera als separate Instanz in der Szene vorhanden ist, um sie zu mischen und die Anzahl der Arten von Kameraereignissen zu vereinfachen, die vom Rest der Codebasis verarbeitet werden müssen.
Trevor Powell

0

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.