EDIT: Para esclarecer qual é exatamente a minha pergunta: esta é uma boa maneira de lidar com animações / estado de animação em um mecanismo de jogo com o olho na criação / gerenciamento de conteúdo? Quais são as falhas em fazê-lo dessa maneira e qual seria uma maneira alternativa de fazê-lo? - Embora minha resposta tenha sido parcialmente respondida nos comentários, como parece ser o caminho a percorrer.
Estou tentando lidar com animações em um projeto de hobby de mecanismo de jogo 2D , sem codificá-las. Estados de animação de codificação embutida me parecem um fenômeno comum, mas muito estranho.
Um pouco de experiência: estou trabalhando com um sistema de entidades em que componentes são sacos de dados e subsistemas atuam sobre eles. Eu escolhi usar um sistema de votação para atualizar os estados de animação.
Com estados de animação, quero dizer: "walking_left", "running_left", "walking_right", "shooting", ...
Minha idéia para lidar com animações foi projetá-la como um modelo orientado a dados . Os dados podem ser armazenados em um arquivo xml, rdbms, ... E podem ser carregados no início de um jogo / nível / ... Dessa forma, você pode editar facilmente animações e transições sem precisar alterar o código em qualquer lugar do jogos.
Como exemplo, fiz um rascunho xml das definições de dados que eu tinha em mente.
Um dado muito importante seria simplesmente a descrição de uma animação . Uma animação teria um ID exclusivo (um nome descritivo). Ele conteria um ID de referência para uma imagem (a folha de sprite que ela usa, porque diferentes animações podem usar folhas de sprite diferentes). Os quadros por segundo para executar a animação. O "replay" aqui define se uma animação deve ser executada uma vez ou infinitamente. Então defini uma lista de retângulos como quadros.
<animation id='WIZARD_WALK_LEFT'>
<image id='WIZARD_WALKING' />
<fps>50</fps>
<replay>true</replay>
<frames>
<rectangle>
<x>0</x>
<y>0</y>
<width>45</width>
<height>45</height>
</rectangle>
<rectangle>
<x>45</x>
<y>0</y>
<width>45</width>
<height>45</height>
</rectangle>
</frames>
</animation>
Os dados da animação seriam carregados e mantidos em um pool de recursos de animação e referenciados pelas entidades do jogo que os estão usando. Seria tratado como um recurso como uma imagem, um som, uma textura, ...
O segundo dado a ser definido seria uma máquina de estados para manipular estados e transições de animação . Isso define cada estado em que uma entidade do jogo pode estar, em quais estados pode fazer a transição e o que aciona essa alteração de estado.
Essa máquina de estado seria diferente de entidade para entidade. Porque um pássaro pode ter estados "andando" e "voando", enquanto um humano teria apenas o estado "andando". No entanto, pode ser compartilhado por diferentes entidades, porque vários seres humanos provavelmente terão os mesmos estados (especialmente quando você define alguns NPCs comuns, como monstros, etc.). Além disso, um orc pode ter os mesmos estados que um humano. Apenas para demonstrar que essa definição de estado pode ser compartilhada, mas apenas por um grupo selecionado de entidades do jogo .
<state id='IDLE'>
<event trigger='LEFT_DOWN' goto='MOVING_LEFT' />
<event trigger='RIGHT_DOWN' goto='MOVING_RIGHT' />
</state>
<state id='MOVING_LEFT'>
<event trigger='LEFT_UP' goto='IDLE' />
<event trigger='RIGHT_DOWN' goto='MOVING_RIGHT' />
</state>
<state id='MOVING_RIGHT'>
<event trigger='RIGHT_UP' goto='IDLE' />
<event trigger='LEFT_DOWN' goto='MOVING_LEFT' />
</state>
Esses estados podem ser tratados por um sistema de votação . Cada marca de jogo captura o estado atual de uma entidade do jogo e verifica todos os gatilhos. Se uma condição for atendida, ele altera o estado da entidade para o estado "goto".
A última parte com a qual eu estava lutando era como vincular dados de animação e estados de animação a uma entidade . A abordagem mais lógica me pareceu adicionar um ponteiro aos dados da máquina de estado que uma entidade usa e definir para cada estado nessa máquina qual animação ela usa.
Aqui está um exemplo xml de como eu definiria o comportamento da animação e a representação gráfica de algumas entidades comuns em um jogo, abordando o estado da animação e o ID dos dados da animação. Observe que "wizard" e "orc" têm os mesmos estados de animação, mas uma animação diferente. Além disso, uma animação diferente pode significar uma folha de sprite diferente ou mesmo uma sequência diferente de animações (uma animação pode ser maior ou menor).
<entity name="wizard">
<state id="IDLE" animation="WIZARD_IDLE" />
<state id="MOVING_LEFT" animation="WIZARD_WALK_LEFT" />
</entity>
<entity name="orc">
<state id="IDLE" animation="ORC_IDLE" />
<state id="MOVING_LEFT" animation="ORC_WALK_LEFT" />
</entity>
Quando a entidade está sendo criada, ela adiciona uma lista de estados com dados da máquina de estados e uma referência de dados de animação.
No futuro, eu usaria o sistema de entidades para construir entidades inteiras, definindo componentes em um formato xml semelhante.
-
É isso que eu inventei depois de algumas pesquisas. No entanto, tive alguns problemas para contornar a questão, então estava esperando algum feedback. Existe algo aqui que não faz sentido, ou existe uma maneira melhor de lidar com essas coisas? Compreendi a ideia de iterar pelos quadros, mas estou tendo problemas para dar um passo adiante e essa é minha tentativa de fazer isso.