Das Paradigma der komponentenbasierten Spielprogrammierung wird immer beliebter. Ich habe mich gefragt, ob es Projekte gibt, die ein wiederverwendbares Komponenten-Framework bieten. In jeder Sprache ist mir das wohl egal. Es ist nicht für mein eigenes Projekt, ich bin nur neugierig.
Konkret meine ich, gibt es Projekte, die eine Basisklasse Entity
, eine Basisklasse Component
und möglicherweise einige Standardkomponenten enthalten? Es wäre dann viel einfacher, ein Spiel zu starten, wenn Sie das Rad nicht neu erfinden möchten, oder wenn Sie ein Spiel möchten GraphicsComponent
, das Sprites mit Direct3D unterstützt, aber Sie glauben, dass es bereits ein Dutzend Mal ausgeführt wurde.
Ein schnelles Googeln taucht auf Rusher . Hat jemand davon gehört / benutzt jemand es? Wenn es keine populären gibt, warum dann nicht? Ist es zu schwierig, so etwas wiederverwendbar zu machen, und sie müssen stark angepasst werden? In meiner eigenen Implementierung habe ich eine Menge Boilerplate gefunden, die sich in ein Framework einschieben ließen.
quelle
Antworten:
Denn es gibt keinen Konsens darüber, wie ein solcher Rahmen funktionieren würde.
In einem Thread auf Gamedev.net stellte ich fest, dass es, wenn Leute über komponentenbasierte Spielesysteme sprechen, tatsächlich mindestens 8 mögliche Permutationen gibt, die davon ausgehen, dass sie funktionieren, basierend auf 3 verschiedenen Faktoren:
Innenborder vs. Außenborder - Sollen Komponenten zu einer Entität zusammengefasst werden oder sollten sie Teil eines Subsystems sein und nur durch eine Entitäts-ID verknüpft werden?
Statische vs. dynamische Komposition - sollten Entitäten aus einer bekannten Menge von Komponenten bestehen (z. B. 1 Physik, 1 Animation, 1 KI usw.), die im Code über bekannte Schnittstellen kommunizieren können, oder können Entitäten beliebige Mengen von Komponenten hinzugefügt werden sie (mit zugehörigen Strategien zur Lokalisierung anderer interessierender Komponenten)
Daten zu einer Komponente im Vergleich zu Daten zu einer Entität - Sollen Daten von der Komponente gespeichert werden, die in erster Linie damit arbeitet? Oder sollten Daten auf der Entität in einem gemeinsam genutzten Bereich gespeichert werden, auf den alle Komponenten zugreifen können?
Darüber hinaus gibt es weitere Fragen, wie die Komponenten kommunizieren sollen (über die gemeinsam genutzten Daten? Über Funktionszeiger? Über Signale / Slots? Oder überhaupt nicht?), Wie sie aktualisiert werden sollen (in einer festen Reihenfolge basierend auf dem Komponententyp? A per -entity-Reihenfolge zum Zeitpunkt der Erstellung definiert (basierend auf einer topologischen Art von Komponenten-Abhängigkeiten?) usw.
Jede dieser Optionen ist völlig willkürlich und alles, was Sie mit einem System tun können, kann mit dem anderen System durchgeführt werden. Aber die Art und Weise, wie Sie es codieren müssen, ist in jedem Fall ganz anders. Und die Leute scheinen eine starke Meinung darüber zu haben, welcher Weg für sie am besten funktioniert.
Im Moment sind die Leute immer noch zu sehr von der Idee gefangen, dass Komponenten ein Ersatz für die Objektorientierung sind (was sie nicht sind) und sie stellen sich auch vor, dass sie eine massive Veränderung gegenüber der traditionellen Herstellung von Spielen darstellen (was sie auch nicht waren) - Die Menschen haben die verschiedenen Subsysteme in ihren Entitäten seit Ewigkeiten ausgeklammert. Vielleicht haben sich die Dinge in ein paar Jahren beruhigt und die Leute entscheiden sich für einen oder zwei ziemlich standardmäßige Ansätze.
quelle
Es gibt ein Wiki, das Beispiele für all diese Dinge sammelt:
http://entity-systems.wikidot.com/
... zusammen mit Erläuterungen zu den Unterschieden zwischen den verschiedenen Ansätzen.
quelle
Überprüfen Sie diese Frameworks, die ich im Zusammenhang mit dieser Architektur herausgefunden habe ...
www.burgerengine.com
PushButtonEngine
Arthemis Framework - https://github.com/artemis-esf/artemis-framework/tree/master/src/com/artemis
Ein Blick auf Unity Api. Sie finden viele Informationen zur komponentenbasierten Architektur. (Wird die Liste aktualisieren, sobald ich etwas mehr finde ...)
Aktualisieren:
Dies erklärt Entity-Systeme auf gute Weise ... http://piemaster.net/2011/07/entity-component-primer/
quelle
Es gibt eine Push Button Engine für Flash: http://pushbuttonengine.com/
Und es gibt Panda3D für c ++ / python: panda3d dot com (sorry, ich darf nur 1 URL pro Post als n00b)
Ich bin mir sicher, dass da draußen noch jede Menge mehr sind :)
quelle