Entitätstypspezifische Aktualisierungen im Entitätskomponentensystem

7

Ich mache mich derzeit mit dem Paradigma der Entitätskomponenten vertraut.

Nehmen wir zum Beispiel ein Kollisionssystem, das erkennt, ob Entitäten kollidieren und ob sie explodieren.

Das Kollisionssystem muss also die Kollision basierend auf der Positionskomponente testen und dann den Status dieser Entitäten auf Explosion setzen.

Was aber, wenn der "Effekt" (das Setzen des Status auf Explosion) für verschiedene Entitäten unterschiedlich ist? Zum Beispiel wird ein Schiff ausgeblendet, während für einen Asteroiden ein Partikelsystem erstellt werden muss. Da Entitäten und Komponenten nur Daten sind, muss dies in einigen Systemen geschehen.

Das Kollisionssystem könnte es tun, aber dann muss es den Entitätstyp umschalten, was meiner Meinung nach eine umständliche und schwer zu erweiternde Lösung ist.

Wie löse ich "Entity Type Dependend" -Updates für eine Entität aus?

Nathan
quelle
Vielleicht möchten Sie ein konkretes Beispiel wie dieses sehen: code.google.com/p/gamadu-starwarrior/source/browse/src/com/…, das mit Artemis Entity System gamadu.com/artemis/tutorial.html
XiaoChuan Yu

Antworten:

6

Zuerst würde ich ein ereignisgesteuertes System verwenden, anstatt eines, das auf Zuständen basiert. Das Setzen eines Zustands auf "explodieren" ist klobig und ziemlich nutzlos, da eine Explosion ein einmaliges Ereignis ist.

Zweitens können Sie das verwenden, was ich als Verhaltenskomponenten bezeichne. Diese Komponenten sind so programmiert, dass sie auf bestimmte Ereignisse wie "explodiert" reagieren. Durch Hinzufügen dieser Komponenten zu einer Entität können Sie leicht ändern, wie die Entität auf Ereignisse reagiert. In diesem Fall können Sie eine FadesOutBehaviour- Komponente erstellen, die an verschiedene Ereignistypen, Überblendungszeiten usw. angepasst werden kann. Wenn eine Entität mit dieser Komponente in die Luft gesprengt wird, wird sie ausgeblendet. Gleiches gilt für eine SpawnsParticlesBehaviour- Komponente.

Was ich in diesem Fall wirklich tun würde, ist, Entitätskomponenten zu geben, die in das "echte Leben" passen würden. Zum Beispiel würde ich auf das Erstellen von Komponenten verzichten, um das Ausbleichen oder das Laichen von Partikeln zu ermöglichen, und stattdessen Komponenten wie FuelTank verwenden (ich kann mir keine vorstellen , die für das Ausbleichen eines Raumschiffs funktionieren würde; das macht nicht einmal Sinn: P). Eine Entität, die FuelTank enthält, kann Feuer fangen, explodieren und gleichzeitig verfolgen, wie viel Kraftstoff noch übrig ist. Zu den Arten von Daten, die ein FuelTank speichern würde, gehören Kapazität, Schaden, Name des Netzes, mit dem er im Modell verknüpft ist usw. Die Strukturierung solcher Entitäten ist für mich sinnvoller.

jmegaffin
quelle
Diese Komponenten haben also die Logik, sich selbst auszublenden, oder gibt es ein FadesOutSystem, um dies zu tun?
Luke B.
Was auch immer du magst. Die Art und Weise, wie ich mit FuelTank erkläre, eignet sich besser für einen Komponenten-als-Daten-Ansatz.
Jmegaffin
Ok, eine Entität, die einen FuelTank enthält, fängt Feuer, wenn sie zerstört wird. Wie und von wem wird dies entschieden und das "Feuer" erzeugt? Muss das Kollisionssystem prüfen, ob eine zerstörte Einheit einen Kraftstofftank enthält?
Nathan
1
So würde ich das FuelTank-Verhalten implementieren: Sie haben ein System, das die verschiedenen Schäden verwaltet, die Spielobjekte erleiden können. Das System überwacht Kollisionsereignisse zwischen Projektilen und den Spielobjekten. Das Kollisionssubsystem ist nur für die Übertragung von Kollisionsereignissen verantwortlich. Wenn das Schadenssystem ein Kollisionsereignis zwischen Entität und Entität empfängt, prüft es, ob eine der Entitäten eine Projektilkomponente und die andere einen FuelTank hat. In diesem Fall ist der FuelTank beschädigt, wodurch möglicherweise ein Feuerpartikelsystem oder eine Explosion entsteht. Das Schadenssystem könnte auch Fahrzeugschäden usw. überwachen
jmegaffin