Dies ist eine Fortsetzung dieser Frage, die ich beantwortet habe, die sich jedoch mit einem viel spezifischeren Thema befasst.
Diese Antwort hat mir geholfen, Entity Systems noch besser zu verstehen als den Artikel.
Ich habe den (ja, den) Artikel über Entity Systems gelesen und darin Folgendes erfahren:
Entitäten sind nur eine ID und ein Array von Komponenten (der Artikel besagt, dass das Speichern von Entitäten in Komponenten keine gute Methode ist, aber keine Alternative darstellt).
Komponenten sind Daten, die angeben, was mit einer bestimmten Entität getan werden kann.
Systeme sind die "Methoden", sie führen die Manipulation von Daten an Entitäten durch.
Dies scheint in vielen Situationen sehr praktisch zu sein, aber die Tatsache, dass Komponenten nur Datenklassen sind, stört mich. Wie könnte ich beispielsweise meine Vector2D-Klasse (Position) in einem Entitätssystem implementieren?
Die Vector2D-Klasse enthält Daten: x- und y-Koordinaten, aber auch Methoden , die für ihre Nützlichkeit von entscheidender Bedeutung sind und die Klasse von nur einem Array mit zwei Elementen unterscheiden. Beispiel Methoden sind: add()
, rotate(point, r, angle)
, substract()
, normalize()
, und alle anderen Standards, nützlich und absolut Methoden erforderlich , dass die Positionen (die Instanzen der Vector2D Klasse) haben sollten.
Wenn die Komponente nur ein Datenbehälter wäre, könnte sie diese Methoden nicht haben!
Eine Lösung, die wahrscheinlich auftauchen könnte, wäre, sie in Systemen zu implementieren, aber das scheint sehr kontraintuitiv zu sein. Diese Methoden sind Dinge, die ich jetzt ausführen möchte. Sie müssen vollständig und einsatzbereit sein. Ich möchte nicht warten, MovementSystem
bis einige teure Nachrichten gelesen wurden, die ihn anweisen, eine Berechnung für die Position einer Entität durchzuführen!
Und in dem Artikel heißt es ganz klar, dass nur Systeme eine Funktion haben sollten , und die einzige Erklärung dafür, die ich finden konnte, war "OOP vermeiden". Erstens verstehe ich nicht, warum ich auf die Verwendung von Methoden in Entitäten und Komponenten verzichten soll. Der Speicheraufwand ist praktisch gleich, und in Verbindung mit Systemen sollten diese auf interessante Weise sehr einfach zu implementieren und zu kombinieren sein. Die Systeme könnten zum Beispiel nur Entitäten / Komponenten mit grundlegender Logik versorgen, die die Implementierung selbst kennen. Wenn Sie mich fragen, ist dies im Grunde genommen die Übernahme der Goodies sowohl von ES als auch von OOP. Dies ist laut dem Autor des Artikels nicht möglich, scheint mir jedoch eine gute Praxis zu sein.
Denken Sie so darüber nach. Es gibt viele verschiedene Arten von Zeichenobjekten in einem Spiel. Einfache alte Bilder, Animationen ( update()
, getCurrentFrame()
usw.), Kombinationen dieser primitiven Typen und alle von ihnen könnten einfach eine draw()
Methode für das Rendersystem bereitstellen, das sich dann nicht nur darum kümmern muss, wie das Sprite einer Entität implementiert wird über die Schnittstelle (zeichnen) und die Position. Und dann bräuchte ich nur ein Animationssystem, das animationsspezifische Methoden aufruft, die nichts mit dem Rendern zu tun haben.
Und nur eine andere Sache ... Gibt es wirklich eine Alternative zu Arrays, wenn es um die Speicherung von Komponenten geht? Ich sehe keinen anderen Ort für die Speicherung von Komponenten als Arrays innerhalb einer Entity-Klasse ...
Vielleicht ist dies ein besserer Ansatz: Speichern Sie Komponenten als einfache Eigenschaften von Entitäten. Beispielsweise würde eine Positionskomponente angeklebt entity.position
.
Der einzige andere Weg wäre, eine Art seltsame Nachschlagetabelle in Systemen zu haben, die auf verschiedene Entitäten verweist. Aber das scheint sehr ineffizient und komplizierter zu sein, als nur Komponenten in der Entität zu speichern.