Eu gostaria de entender melhor como as pessoas no mundo real estão lidando com suas animações.
Você carrega uma imagem grande e desenha retângulos diferentes com base no quadro de animação?
Você carrega arquivos de imagem X em uma matriz e desenha o item na matriz com base no quadro de animação?
Como você lida com diferentes comprimentos de animações para vários sprites.
Digamos que um personagem andando tenha de 4 a 8 quadros, e as ondas na praia apenas de 2 a 3 quadros. Como você lidaria com essa situação? Ver abaixo
Dim Waves(1) as Sprite
Dim Char(5) as Sprite
Sub Animate()
Frame += 1
Draw Char(Frame)
Draw Waves(Frame)
If Frame = 5 Then Frame = 0
End Sub
Obviamente, o Waves acabaria com um erro fora dos limites.
Ou você tem seu sprite preocupado com a própria animação e não se importa com o quadro? Cada sprite conhece seu próprio loop de animação?
Eu teria uma animação saber quantos quadros ela tem. Onde e como eles são armazenados é relativamente irrelevante, exceto por problemas de desempenho (como você pode querer na mesma textura). Eu nunca adicionaria 1 ao número de quadros, acrescentaria deltaTime * animSpeed e converteria esse valor em um número inteiro ao exibir. Dessa forma, você pode diminuir ou acelerar as animações e é independente da taxa de quadros.
Assim, um sprite teria uma animação que se atualiza.
fonte
Por que não apenas armazenar um número de quadros para cada um de seus objetos? Pessoalmente, passo o número de quadros na animação para meus objetos em seus construtores; então, tenho uma função Animate () padrão que absorve a quantidade de quadros na animação.
fonte
Depende da implementação. No meu mecanismo, faço animação no Direct3D e no DirectDraw.
No DirectDraw, crio uma imagem grande. De qualquer maneira, tudo é armazenado na memória do sistema, o que acaba se resumindo a um bloco unidimensional de dados.
Prós:
Contras:
Não é possível copiar apenas um quadro na tela, você deve fazê-lo manualmente.
gigantesco bloco de memória. Hustling frames ao redor vem em uma penalidade.
Em Direct3D Eu uso texturas distintas. Isso ocorre porque eu não tenho idéia das limitações de textura de um dispositivo, então não sei se ele suporta texturas do tamanho de toda a imagem.
Prós:
Contras:
fonte
Nos meus jogos , eu dei à minha classe base Sprite o conhecimento sobre como desenhar a si mesmo, e todos os elementos animados herdam esse conhecimento: número e duração dos quadros de animação, posição na tela etc. O loop principal do jogo itera por todos dos sprites, pedindo que cada um se desenhe como achar melhor. Parece funcionar bastante bem e é um pouco mais modular para inicializar: se você adicionar um novo sprite com um loop de animação diferente (ou ainda mais complexo: vários estados de animação), não precisará voltar e reescrever o Animate () rotina para acomodar a complexidade adicional:
Cada vez que o método update () de um sprite é chamado, ele sabe se deve redesenhar o mesmo quadro da última vez, passar para o próximo quadro na animação atual, mudar para uma nova animação etc.
Isso tem o benefício adicional de facilitar muito o ajuste da taxa de quadros para acomodar velocidades diferentes de renderização de relógio / plataforma, porque a única alteração é a frequência com que você chama Animate ().
fonte