Ich habe kürzlich ein einfaches Space Invadors-Spiel mit einem 'Entity-System' erstellt. Es ist ein Muster, das Attribute und Verhaltensweisen sehr gut voneinander trennt. Ich habe einige Iterationen gebraucht, um es vollständig zu verstehen, aber sobald Sie einige Komponenten entworfen haben, ist es äußerst einfach, neue Objekte mit Ihren vorhandenen Komponenten zu erstellen.
Sie sollten dies lesen:
http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of-mmog-development-part-1/
Es wird häufig von einem äußerst sachkundigen Mann aktualisiert. Es ist auch die einzige Diskussion über Entitätssysteme mit konkreten Codebeispielen.
Meine Iterationen waren wie folgt:
Die erste Iteration hatte ein "EntitySystem" -Objekt, wie Adam es beschreibt; Meine Komponenten hatten jedoch immer noch Methoden - meine 'renderbare' Komponente hatte eine paint () -Methode und meine Positionskomponente hatte eine move () -Methode usw. Als ich anfing, die Entitäten zu konkretisieren, wurde mir klar, dass ich anfangen musste, Nachrichten zwischen ihnen zu übertragen Komponenten und Reihenfolge der Ausführung von Komponenten-Updates .... viel zu chaotisch.
Also ging ich zurück und las den Blog von T-Machines erneut. Es gibt viele Informationen in den Kommentarthreads - und in ihnen betont er wirklich, dass Komponenten kein Verhalten haben - Verhalten wird von den Entitätssystemen bereitgestellt. Auf diese Weise müssen Sie keine Nachrichten zwischen Komponenten übergeben und Komponentenaktualisierungen bestellen, da die Reihenfolge durch die globale Reihenfolge der Systemausführung bestimmt wird. In Ordnung. Vielleicht ist das zu abstrakt.
Für Iteration Nr. 2 habe ich Folgendes aus dem Blog entnommen:
EntityManager - fungiert als Komponente "Datenbank", die nach Entitäten abgefragt werden kann, die bestimmte Arten von Komponenten enthalten. Dies kann sogar durch eine In-Memory-Datenbank für einen schnellen Zugriff gesichert werden. Weitere Informationen finden Sie in Teil 5 von t-machine.
EntitySystem - Jedes System ist im Wesentlichen nur eine Methode, die mit einer Reihe von Entiten arbeitet. Jedes System verwendet die Komponenten x, y und z einer Entität, um ihre Arbeit zu erledigen. Sie würden also den Manager nach Entitäten mit den Komponenten x, y und z abfragen und dieses Ergebnis dann an das System übergeben.
Entität - nur eine ID, wie eine lange. Die Entität gruppiert eine Reihe von Komponenteninstanzen zu einer 'Entität'.
Komponente - eine Reihe von Feldern .... keine Verhaltensweisen! Wenn Sie anfangen, Verhaltensweisen hinzuzufügen, wird es unordentlich ... selbst in einem einfachen Space Invadors-Spiel.
Bearbeiten : 'dt' ist übrigens die Deltazeit seit dem letzten Aufruf der Hauptschleife
Meine Haupt-Invadors-Schleife lautet also:
Collection<Entity> entitiesWithGuns = manager.getEntitiesWith(Gun.class);
Collection<Entity> entitiesWithDamagable =
manager.getEntitiesWith(BulletDamagable.class);
Collection<Entity> entitiesWithInvadorDamagable = manager.getEntitiesWith(InvadorDamagable.class);
keyboardShipControllerSystem.update(entitiesWithGuns, dt);
touchInputSystem.update(entitiesWithGuns, dt);
Collection<Entity> entitiesWithInvadorMovement = manager.getEntitiesWith(InvadorMovement.class);
invadorMovementSystem.update(entitiesWithInvadorMovement);
Collection<Entity> entitiesWithVelocity = manager.getEntitiesWith(Velocity.class);
movementSystem.move(entitiesWithVelocity, dt);
gunSystem.update(entitiesWithGuns, System.currentTimeMillis());
Collection<Entity> entitiesWithPositionAndForm = manager.getEntitiesWith(Position.class, Form.class);
collisionSystem.checkCollisions(entitiesWithPositionAndForm);
Es sieht auf den ersten Blick etwas seltsam aus, ist aber unglaublich flexibel. Es ist auch sehr einfach zu optimieren; Für verschiedene Komponententypen können verschiedene Backing-Datenspeicher verwendet werden, um das Abrufen zu beschleunigen. Für die 'Formular'-Klasse können Sie sie mit einem Quadtree sichern, um den Zugriff für die Kollisionserkennung zu beschleunigen.
Ich bin wie du; Ich bin ein erfahrener Entwickler, hatte aber keine Erfahrung mit dem Schreiben von Spielen. Ich habe einige Zeit damit verbracht, Nachforschungen über Entwicklungsmuster anzustellen, und dieses ist mir aufgefallen. Es ist keineswegs die einzige Möglichkeit, Dinge zu tun, aber ich fand es sehr intuitiv und robust. Ich glaube, das Muster wurde offiziell in Buch 6 der Reihe "Game Programming Gems" - http://www.amazon.com/Game-Programming-Gems/dp/1584500492 - besprochen . Ich habe selbst keines der Bücher gelesen, aber ich höre, dass sie de facto die Referenz für die Spielprogrammierung sind.