Ich aktualisiere meine Antwort, weil viele Dinge vor den Kommentaren nicht klar waren. Bitte entblößen Sie mich, während ich meine Gedanken erkläre.
Im Allgemeinen sind Kohäsion und Kopplung zwei Schlüsselaspekte, die bei jedem Entwurf berücksichtigt werden müssen . Wir alle wissen, dass wir eine hohe Kohäsion und eine geringe Kopplung benötigen, um ein wiederverwendbareres und erweiterbares Design zu erhalten.
Wenn die Welt also alles verwalten muss, bedeutet dies, dass sie einen geringen Zusammenhalt und eine enge Kopplung aufweist (weil sie alles wissen und tun muss). Dies ist jedoch auch dann der Fall, wenn eine Spieleinheit alles tun muss. Aktualisieren Sie seinen Standort, rendern Sie seine Textur usw. usw.
Was Sie wirklich interessiert, ist die Erstellung von Systemen, die sich auf einen Aspekt der Entität konzentrieren. Zum Beispiel könnte eine Spielentität eine Textur haben, aber ein Renderer wäre dafür verantwortlich, diese Textur auf dem Bildschirm zu rendern. Dem Renderer ist es egal, über welche anderen Eigenschaften die Entität verfügt.
Wenn man etwas weiter geht, ist eine Spieleinheit einfach eine Tüte mit Eigenschaften. Diese Eigenschaften werden von Systemen manipuliert, die sich auf bestimmte Eigenschaften konzentrieren. Und hier kommen komponentenbasierte Entitätssysteme (CBES) ins Spiel, bei denen Eigenschaften = Komponenten sind.
Insbesondere CBES mit Systemen (oder Subsystemen). Bei diesem Entwurf gibt es in der Regel einige Systeme, die sich auf bestimmte Komponenten einer Entität konzentrieren, ohne sich um die anderen Komponenten der Entität zu kümmern. Außerdem sind die Systeme nur mit den Informationen gekoppelt, die sie zur Verarbeitung dieser Komponenten benötigen.
Nehmen wir Ihr Beispiel. Da die Eingabe, wohin die Entität verschoben werden soll, auf dem Controller des Players basiert, hätten Sie wahrscheinlich ein PlayerControllerSystem. Dieses System würde neben vielen anderen Dingen die PositionComponent der Entität steuern. In diesem Fall müsste das PlayerControllerSystem die Ebene und die PositionComponent kennen. Wenn Sie sich später dazu entschließen, die Kollisionserkennung hinzuzufügen, würden Sie ein CollisionSystem erstellen, das erneut die Position der Entitäten verwendet, diesmal jedoch zur Berechnung der Begrenzungsrahmen (oder Sie könnten eine BoundingBoxComponent, Ihren Aufruf, haben). Tatsache ist, dass Sie das Verhalten einfach ein- oder ausschalten können (auch im laufenden Betrieb), indem Sie einfach Komponenten hinzufügen / entfernen. Mehr Verhalten bedeutet also, dass mehr Systeme die Komponenten einer Entität manipulieren, aber alle gehören zu einer genau definierten Klasse mit geringer Kopplung. Willst du Skripte? Fügen Sie eine ScriptComponent hinzu. BAM! Sie haben gerade Skriptfunktionen mit 2 Klassen hinzugefügt. Physik? Klang? Das selbe nochmal.
Der Grund, warum ich CBES mit SubSystems befürworte, ist, dass es perfekt OO und ein insgesamt leicht zu wartendes / erweiterbares System ist. Das Hinzufügen eines Verhaltens zu einer Entität ist so einfach wie die Entscheidung, welche Daten dieses Verhalten benötigt und welche Entitäten es benötigen.
Für weitere Informationen zu komponentenbasierten Entity-Systemen mit SubSystems gibt es eine hervorragende Reihe von Blog-Posts von T = Machine bei Entity Systems, die die Zukunft der MMOG-Entwicklung darstellen . Der Autor ging sogar so weit, ein Wiki zum Sammeln verschiedener Implementierungen mit dem Namen Entity Systems Project zu erstellen
Ein allgemeiner (und bekannter) Beitrag über komponentenbasierte Entitätssysteme im Allgemeinen ist die Evolve your hierarchy , die das System für Tony Hawk Pro erstellt hat.
Wenn Sie nach einer Bibliothek mit Beispielcode suchen, gehen Sie nicht weiter als bis zur Artemis- Bibliothek. Artemis ist hauptsächlich in Java, aber hier ist ein Port in C # (den ich derzeit in meinem XNA-Projekt verwende).
Actor
wissenworld
?