Ich bin ziemlich neu in der Idee von Entitätssystemen, nachdem ich eine Menge Dinge gelesen habe (am nützlichsten dieser großartige Blog und diese Antwort ).
Obwohl ich ein wenig Probleme habe zu verstehen, wie einfach es ist, die Position eines Objekts durch eine undefinierte Anzahl von Quellen zu manipulieren.
Das heißt, ich habe meine Entität, die eine Positionskomponente hat. Ich habe dann ein Ereignis im Spiel, das dieser Entität sagt, dass sie sich in einer bestimmten Zeit um eine bestimmte Strecke bewegen soll.
Diese Ereignisse können jederzeit auftreten und haben unterschiedliche Werte für Position und Zeit. Das Ergebnis ist, dass sie zusammengesetzt würden.
In einer herkömmlichen OO-Lösung hätte ich eine Art MoveBy
Klasse, die die Entfernung / Zeit und eine Reihe von Klassen in meiner Spielobjektklasse enthält. Bei jedem Frame würde ich alle durchlaufen MoveBy
und auf die Position anwenden. Wenn a MoveBy
seine Endzeit erreicht hat, entfernen Sie es aus dem Array.
Mit dem Entitätssystem bin ich ein wenig verwirrt darüber, wie ich diese Art von Verhalten replizieren soll.
Wenn es nur eine davon zu einer Zeit gäbe, anstatt sie zusammenzusetzen, wäre es ziemlich einfach (glaube ich) und würde ungefähr so aussehen:
PositionComponent
enthält x, y
MoveByComponent
enthält x, y, time
Entity
welches sowohl a PositionComponent
als auch a hatMoveByComponent
MoveBySystem
Das sucht nach einer Entität mit diesen beiden Komponenten und addiert den Wert von MoveByComponent
zu PositionComponent
. Wenn das time
erreicht ist, wird die Komponente aus dieser Entität entfernt.
Ich bin ein bisschen verwirrt darüber, wie ich das gleiche mit vielen Moves machen würde.
Meine ersten Gedanken sind, dass ich hätte:
PositionComponent
, MoveByComponent
Die gleichen wie oben
MoveByCollectionComponent
welches ein Array von MoveByComponent
s enthält
MoveByCollectionSystem
das sucht nach einer Entität mit a PositionComponent
und a MoveByCollectionComponent
, die durch das MoveByComponent
s darin iteriert und nach Bedarf anwendet / entfernt.
Ich denke, dies ist ein allgemeineres Problem, viele der gleichen Komponenten zu haben und zu wollen, dass ein entsprechendes System auf jede einzelne einwirkt. Meine Entitäten enthalten ihre Komponenten in einem Hash vom Komponententyp -> Komponente, haben also streng genommen nur 1 Komponente eines bestimmten Typs pro Entität.
Ist das der richtige Weg, dies zu betrachten?
Sollte eine Entität immer nur eine Komponente eines bestimmten Typs haben?
move x by 10 in 2 seconds
und move x by -10 in 2 seconds
das Unternehmen vollkommen still stehen würde?
MoveBy
Funktionalität nur eine Geschwindigkeit? Es hört sich so an, als wären Sie auf dem richtigen Weg. Für Ihre zweite Frage gibt es viele verschiedene Implementierungen von Entitäts- / Komponentensystemen. Die in meiner Antwort, die Sie verlinkt haben, beschriebene Beschreibung enthält nur eine Komponente eines bestimmten Typs.