Recientemente hice un juego simple de Space Invadors usando un 'sistema de entidad'. Es un patrón que separa atributos y comportamientos extremadamente bien. Me tomó algunas iteraciones entenderlo completamente, pero una vez que se diseñaron algunos componentes, se vuelve extremadamente simple componer nuevos objetos usando sus componentes existentes.
Deberías leer esto:
http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of-mmog-development-part-1/
Se actualiza con frecuencia por un tipo extremadamente conocedor. También es la única discusión del sistema de entidades con ejemplos de códigos concretos.
Mis iteraciones fueron las siguientes:
La primera iteración tenía un objeto "EntitySystem" que era como Adam describe; sin embargo, mis componentes todavía tenían métodos: mi componente 'renderizable' tenía un método paint (), y mi componente de posición tenía un método move (), etc. Cuando comencé a desarrollar las entidades, me di cuenta de que necesitaba comenzar a pasar el mensaje entre componentes y ordenar la ejecución de actualizaciones de componentes ... demasiado desordenado.
Entonces, volví y releí el blog de T-machines. Hay mucha información en los hilos de comentarios, y en ellos él realmente enfatiza que los componentes no tienen comportamientos, los comportamientos son proporcionados por los sistemas de la entidad. De esta manera, no necesita pasar mensajes entre los componentes y ordenar actualizaciones de componentes porque el orden está determinado por el orden global de ejecución del sistema. Okay. Quizás eso es demasiado abstracto.
De todos modos para la iteración # 2, esto es lo que obtuve del blog:
EntityManager: actúa como la "base de datos" de componentes, que se puede consultar para las entidades que contienen ciertos tipos de componentes. Esto incluso puede ser respaldado por una base de datos en memoria para un acceso rápido ... vea la parte 5 de t-machine para más información.
EntitySystem: cada sistema es esencialmente un método que funciona en un conjunto de entidades. Cada sistema utilizará el componente x, y y z de una entidad para realizar su trabajo. Por lo tanto, consultaría al administrador de entidades con componentes x, y y z y luego pasaría ese resultado al sistema.
Entidad: solo una identificación, como una larga. La entidad es lo que agrupa un conjunto de instancias de componentes en una 'entidad'.
Componente: un conjunto de campos ... ¡sin comportamientos! cuando comienzas a agregar comportamientos, comienza a complicarse ... incluso en un simple juego de Space Invadors.
Editar : por cierto, 'dt' es el tiempo delta desde la última invocación del bucle principal
Entonces mi bucle principal de Invadors es este:
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);
Parece un poco raro al principio, pero es increíblemente flexible. También es muy fácil de optimizar; para diferentes tipos de componentes, puede tener diferentes almacenes de datos de respaldo para acelerar la recuperación. Para la clase 'form' puede respaldarlo con un quadtree para acelerar el acceso para la detección de colisiones.
Soy como tú; Soy un desarrollador experimentado pero no tenía experiencia escribiendo juegos. Pasé un tiempo investigando patrones de desarrollo, y este me llamó la atención. De ninguna manera es la única forma de hacer las cosas, pero lo he encontrado muy intuitivo y robusto. Creo que el patrón se discutió oficialmente en el libro 6 de la serie "Gemas de programación de juegos": http://www.amazon.com/Game-Programming-Gems/dp/1584500492 . No he leído ninguno de los libros, pero escuché que son la referencia de facto para la programación de juegos.