J'ai récemment fait un simple jeu Space Invadors en utilisant un «système d'entités». C'est un modèle qui sépare extrêmement bien les attributs et les comportements. Il m'a fallu quelques itérations pour bien le comprendre, mais une fois que vous avez conçu quelques composants, il devient extrêmement simple de composer de nouveaux objets en utilisant vos composants existants.
Vous devriez lire ceci:
http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of-mmog-development-part-1/
Il est mis à jour fréquemment par un gars extrêmement compétent. C'est aussi la seule discussion sur le système d'entités avec des exemples de code concrets.
Mes itérations se sont déroulées comme suit:
La première itération avait un objet "EntitySystem" qui était comme Adam le décrit; cependant, mes composants avaient encore des méthodes - mon composant «rendable» avait une méthode paint (), et mon composant position avait une méthode move () et etc. Quand j'ai commencé à étoffer les entités, j'ai réalisé que je devais commencer à passer un message entre composants et ordonner l'exécution des mises à jour des composants .... trop désordonné.
Alors, je suis retourné et relu le blog T-machines. Il y a beaucoup d'informations dans les fils de commentaires - et dans ceux-ci, il souligne vraiment que les composants n'ont pas de comportements - les comportements sont fournis par les systèmes d'entités. De cette façon, vous n'avez pas besoin de passer de messages entre les composants et de commander les mises à jour des composants car l'ordre est déterminé par l' ordre global d'exécution du système. D'accord. C'est peut-être trop abstrait.
Quoi qu'il en soit pour l'itération # 2, voici ce que j'ai glané du blog:
EntityManager - agit comme la "base de données" des composants, qui peut être interrogée pour les entités qui contiennent certains types de composants. Cela peut même être soutenu par une base de données en mémoire pour un accès rapide ... voir t-machine partie 5 pour plus d'informations.
EntitySystem - Chaque système est essentiellement juste une méthode qui fonctionne sur un ensemble d'entités. Chaque système utilisera les composants x, y et z d'une entité pour faire son travail. Vous devez donc interroger le gestionnaire pour les entités avec les composants x, y et z, puis transmettre ce résultat au système.
Entité - juste un identifiant, comme un long. L'entité est ce qui regroupe un ensemble d'instances de composants en une «entité».
Composant - un ensemble de champs .... pas de comportements! lorsque vous commencez à ajouter des comportements, cela commence à devenir désordonné ... même dans un simple jeu Space Invadors.
Edit : au fait, 'dt' est le temps delta depuis la dernière invocation de la boucle principale
Donc, ma boucle Invadors principale est la suivante:
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);
Ça a l'air un peu bizarre au début, mais c'est incroyablement flexible. Il est également très facile à optimiser; pour différents types de composants, vous pouvez avoir différentes banques de données de support pour accélérer la récupération. Pour la classe «forme», vous pouvez la faire appuyer sur un arbre quadruple pour accélérer l'accès pour la détection de collision.
Je suis comme vous; Je suis un développeur chevronné mais je n'avais aucune expérience dans l'écriture de jeux. J'ai passé un certain temps à rechercher des modèles de développement et celui-ci a attiré mon attention. Ce n'est en aucun cas le seul moyen de faire les choses, mais je l'ai trouvé très intuitif et robuste. Je crois que le modèle a été officiellement discuté dans le livre 6 de la série "Game Programming Gems" - http://www.amazon.com/Game-Programming-Gems/dp/1584500492 . Je n'ai lu aucun des livres moi-même mais j'entends qu'ils sont la référence de facto pour la programmation de jeux.