Sou bastante novo na idéia de sistemas de entidades, depois de ler várias coisas (muito útil, este ótimo blog e esta resposta ).
Embora eu esteja tendo problemas para entender como algo tão simples quanto poder manipular a posição de um objeto por um número indefinido de fontes.
Ou seja, eu tenho minha entidade, que tem um componente de posição. Então, eu tenho algum evento no jogo que diz a essa entidade para mover uma determinada distância, em um determinado momento.
Esses eventos podem ocorrer a qualquer momento e terão valores diferentes para posição e hora. O resultado é que eles seriam compostos juntos.
Em uma solução OO tradicional, eu teria algum tipo de MoveBy
classe, que contém a distância / tempo e uma matriz daquelas dentro da minha classe de objeto de jogo. Cada quadro, eu percorria todos os MoveBy
e aplicava à posição. Se a MoveBy
atingir o tempo de término, remova-o da matriz.
Com o sistema de entidades, estou um pouco confuso sobre como devo replicar esse tipo de comportamento.
Se houvesse apenas um deles de cada vez, em vez de ser capaz de combiná-los, seria bastante direto (acredito) e seria algo como isto:
PositionComponent
contendo x, y
MoveByComponent
contendo x, y, time
Entity
que tem um PositionComponent
e umMoveByComponent
MoveBySystem
que procura uma entidade com esses dois componentes e agrega o valor de MoveByComponent
a PositionComponent
. Quando o time
é atingido, ele remove o componente dessa entidade.
Estou um pouco confuso sobre como eu faria a mesma coisa com muitos movimentos.
Meu pensamento inicial é que eu teria:
PositionComponent
, MoveByComponent
o mesmo que acima
MoveByCollectionComponent
que contém uma matriz de MoveByComponent
s
MoveByCollectionSystem
que procura uma entidade com a PositionComponent
e a MoveByCollectionComponent
, iterando através dos MoveByComponent
s dentro dela, aplicando / removendo conforme necessário.
Acho que esse é um problema mais geral: ter muitos do mesmo componente e querer que um sistema correspondente atue em cada um. Minhas entidades contêm seus componentes dentro de um hash do tipo de componente -> componente, portanto, possuem apenas 1 componente de um tipo específico por entidade.
É este o caminho certo para olhar para isso?
Uma entidade deve sempre ter um componente de um determinado tipo o tempo todo?
move x by 10 in 2 seconds
e move x by -10 in 2 seconds
a entidade permanecesse perfeitamente imóvel?
MoveBy
funcionalidade é apenas uma velocidade? Parece que você está no caminho certo. Para sua segunda pergunta, há diversas implementações diferentes de sistemas de entidade / componente. O descrito na minha resposta que você vinculou teria apenas um componente de um determinado tipo.