Estou tentando projetar um sistema de entidade baseado em componentes para fins de aprendizado (e uso posterior em alguns jogos) e estou tendo alguns problemas quando se trata de atualizar estados de entidade.
Não quero ter um método update () dentro do componente para evitar dependências entre componentes.
O que tenho atualmente em mente é que os componentes retêm dados e os sistemas atualizam os componentes.
Portanto, se eu tiver um jogo 2D simples com algumas entidades (por exemplo, jogador, inimigo1, inimigo2) que possuam componentes de transformação, movimento, estado, animação e renderização, acho que devo ter:
- Um MovementSystem que move todos os componentes do Movimento e atualiza os componentes do Estado
- E um RenderSystem que atualiza os componentes de Animação (o componente de animação deve ter uma animação (ou seja, um conjunto de quadros / texturas) para cada estado e atualizá-lo significa selecionar a animação correspondente ao estado atual (por exemplo, salto, deslocamento_querido, etc), e atualização do índice de quadros). Em seguida, o RenderSystem atualiza os componentes Render com a textura correspondente ao quadro atual da Animação de cada entidade e renderiza tudo na tela.
Eu já vi algumas implementações como o framework Artemis, mas não sei como resolver essa situação:
Digamos que meu jogo tenha as seguintes entidades. Cada entidade possui um conjunto de estados e uma animação para cada estado:
- jogador: "inativo", "moving_right", "jumping"
- enemy1: "moving_up", "moving_down"
- enemy2: "moving_left", "moving_right"
Quais são as abordagens mais aceitas para atualizar o estado atual de cada entidade? A única coisa em que consigo pensar é em ter sistemas separados para cada grupo de entidades e componentes separados de Estado e Animação, para que eu tivesse PlayerState, PlayerAnimation, Enemy1State, Enemy1Animation ... PlayerMovementSystem, PlayerRenderingSystem ... mas acho que isso é ruim solução e quebra o propósito de ter um sistema baseado em componentes.
Como você pode ver, estou bastante perdido aqui, por isso gostaria muito de receber qualquer ajuda.
EDIT: Eu acho que a solução para fazer isso funcionar como pretendo é esta:
Você torna o componente statecomponent e animationcomponent genérico o suficiente para ser usado para todas as entidades. Os dados que eles contêm serão o modificador para alterar coisas como quais animações são reproduzidas ou quais estados estão disponíveis. - Byte56
Agora, estou tentando descobrir como projetar esses 2 componentes genéricos o suficiente para que eu possa reutilizá-los. Ter um UID para cada estado (por exemplo, caminhar, correr ...) e armazenar animações em um mapa no AnimationComponent codificado por esse identificador pode ser uma boa solução?
statecomponent
e animationcomponent
genérico o suficiente para ser usado para todas as entidades. Os dados que eles contêm serão o modificador para alterar coisas como quais animações são reproduzidas ou quais estados estão disponíveis.