Recentemente, fiz um jogo simples do Space Invadors usando um 'sistema de entidades'. É um padrão que separa atributos e comportamentos extremamente bem. Levei algumas iterações para entendê-lo completamente, mas depois que alguns componentes foram projetados, torna-se extremamente simples compor novos objetos usando os componentes existentes.
Você deve ler isto:
http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of-mmog-development-part-1/
É atualizado com freqüência por um cara extremamente qualificado. É também a única discussão do sistema de entidades com exemplos concretos de código.
Minhas iterações foram da seguinte maneira:
A primeira iteração tinha um objeto "EntitySystem" que era como Adam descreve; no entanto, meus componentes ainda tinham métodos - meu componente 'renderizável' tinha um método paint () e meu componente de posição tinha um método move () e etc. Quando comecei a detalhar as entidades, percebi que precisava começar a passar a mensagem entre componentes e ordenando a execução de atualizações de componentes .... muito confuso.
Então, voltei e reli o blog da T-machines. Há muitas informações nos tópicos de comentários - e neles ele realmente enfatiza que os componentes não têm comportamentos - comportamentos são fornecidos pelos sistemas da entidade. Dessa forma, você não precisa passar mensagens entre componentes e atualizar as atualizações dos componentes porque a ordem é determinada pela ordem global de execução do sistema. Está bem. Talvez isso seja abstrato demais.
Enfim, para a iteração 2, é isso que eu colhi no blog:
EntityManager - atua como o componente "banco de dados", que pode ser consultado por entidades que contêm certos tipos de componentes. Isso pode até ser apoiado por um banco de dados na memória para acesso rápido ... consulte a parte 5 da t-machine para obter mais informações.
EntitySystem - Cada sistema é essencialmente apenas um método que opera em um conjunto de entidades. Cada sistema usará os componentes x, ye z de uma entidade para realizar seu trabalho. Portanto, você consultaria o gerente sobre entidades com os componentes x, ye z, em seguida, passaria esse resultado para o sistema.
Entidade - apenas um ID, como um longo. A entidade é o que agrupa um conjunto de instâncias de componentes em uma 'entidade'.
Componente - um conjunto de campos .... sem comportamentos! quando você começa a adicionar comportamentos, começa a ficar bagunçado ... mesmo em um simples jogo Space Invadors.
Edit : a propósito, 'dt' é o tempo delta desde a última invocação do loop principal
Então, meu loop principal dos Invadors é o seguinte:
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 um pouco estranho no começo, mas é incrivelmente flexível. Também é muito fácil de otimizar; para diferentes tipos de componentes, você pode ter diferentes datastores de backup para acelerar a recuperação. Para a classe 'form', você pode apoiá-la com um quadtree para acelerar o acesso à detecção de colisão.
Eu sou como você; Sou um desenvolvedor experiente, mas não tive experiência em escrever jogos. Passei algum tempo pesquisando padrões de desenvolvimento, e este chamou minha atenção. Não é de forma alguma a única maneira de fazer as coisas, mas eu achei muito intuitivo e robusto. Acredito que o padrão foi discutido oficialmente no livro 6 da série "Game Programming Gems" - http://www.amazon.com/Game-Programming-Gems/dp/1584500492 . Eu não li nenhum dos livros, mas soube que eles são a referência de fato para a programação de jogos.