Estou atualizando minha resposta porque muitas coisas não estavam claras antes dos comentários. Por favor, fique comigo enquanto explico meus pensamentos.
Em geral, dois aspectos principais a serem considerados em qualquer projeto são a coesão e o acoplamento . Todos sabemos que precisamos de alta coesão e baixo acoplamento para poder criar um design mais reutilizável e extensível.
Portanto, se o mundo precisa gerenciar tudo, isso significa que ele possui baixa coesão e acoplamento rígido (porque precisa saber e fazer tudo). No entanto, esse também é o caso quando uma entidade do jogo precisa fazer tudo. Atualize sua localização, renderize sua textura, etc. etc.
O que você realmente está interessado é criar sistemas que se concentrem em um aspecto da entidade. Por exemplo, uma entidade do jogo poderia ter uma Textura, mas um Renderer seria responsável por renderizar essa textura na tela. O Renderer não se importa com as outras propriedades da entidade.
Indo um pouco mais longe, uma entidade do jogo é simplesmente um saco de propriedades. Essas propriedades são manipuladas por sistemas focados em propriedades específicas. E é aí que os Sistemas de Entidades Baseados em Componentes (CBES) entram, onde propriedades = componentes.
Especificamente, CBES com sistemas (ou subsistemas). Esse design tende a ter alguns sistemas focados em componentes específicos de uma entidade, sem se preocupar com os outros componentes que a entidade possui. Além disso, os sistemas são acoplados apenas às informações necessárias para processar esses componentes.
Vamos dar o seu exemplo. Como a entrada de onde mover a entidade é baseada no controlador do player, você provavelmente teria um PlayerControllerSystem. Esse sistema controlaria, além de muitas outras coisas, o PositionComponent da entidade. Nesse caso, o PlayerControllerSystem precisaria saber sobre o Level e o PositionComponent. Se, posteriormente, você decidir adicionar a detecção de colisão, criaria um CollisionSystem que usaria novamente a posição das entidades, mas desta vez para calcular as caixas delimitadoras (ou você pode ter um BoundingBoxComponent, sua chamada). O fato é que você pode ativar ou desativar facilmente o comportamento (mesmo em movimento) simplesmente adicionando / removendo componentes. Portanto, mais comportamento significa que mais sistemas estão manipulando os componentes de uma entidade, mas todos eles estão em uma classe bem definida com baixo acoplamento. Quer scripts? Adicione um ScriptComponent. BAM! Você acabou de adicionar recursos de script com 2 classes. Física? Som? O mesmo novamente.
Portanto, a razão pela qual estou defendendo o CBES com os subsistemas é que ele é perfeitamente OO e um sistema fácil de manter / extensível em geral. Adicionar um comportamento a uma entidade é tão simples quanto decidir quais dados esse comportamento precisa e quais entidades precisam.
Para obter mais informações sobre os sistemas de entidades baseados em componentes com subsistemas, há uma excelente série de postagens de blog de T = Machine na Entity Systems, que são o futuro do desenvolvimento do MMOG . O autor chegou a criar um wiki para coletar várias implementações denominadas Entity Systems Project
Um post geral (e bem conhecido) sobre os sistemas de entidades baseados em componentes em geral é o Evolve sua hierarquia que criou o sistema para o Tony Hawk Pro.
Finalmente, se você estiver procurando por uma biblioteca com código de exemplo, não vá além da biblioteca Artemis . Artemis é principalmente em Java, mas aqui está uma porta em C # (que atualmente estou usando no meu projeto XNA).
Actor
saber sobreworld
tudo?