Não entendo como usar uma máquina de estados finitos com a entidade controlada pelo jogador.
Por exemplo, eu tenho um jogo estilo Mario (plataforma 2D). Eu posso pular, correr, andar, sofrer danos, nadar, etc. Então, meu primeiro pensamento foi usar essas ações como estados. Mas o que acontece, se você estiver correndo quando sofrer danos? Ou pular, sofrer danos e atirar ao mesmo tempo?
Eu só quero adicionar funcionalidades (ações) ao player de uma maneira limpa (sem usá-lo para todas as ações na atualização da entidade).
Respostas:
Eu acho que a maneira normal é ter várias máquinas de estado. Dessa forma, você pode se ater aos estados atômicos, o que geralmente facilita muito a sua vida do que ter que lidar com estados complexos.
Por exemplo:
No design orientado a objetos, existe o padrão satisfatório para isso. Tudo se resume a ter uma interface por máquina de estado. E uma classe por estado possível que implementa essa interface.
Para dar um exemplo: haveria uma interface DamageMode e as subclasses NormalDamageMode, InvulnerableDamageMode e InvincibleDamageMode. Sempre que o jogador colidir com um inimigo, o método DamageMode.collision (inimigo) é chamado. É tratado pela classe responsável pelo estado atual.
Portanto, se damageMode == NormalDamageMode, o player será danificado e a variável de estado será definida como InvulnerableDamageMode. No InvulnerableDamageMode nada acontece e no InvincibleDamageMode o inimigo será danificado. É claro que é preciso haver temporizadores para voltar de InvulnerableDamageMode e InvincibleDamageMode para NormalDamageMode.
A principal vantagem do padrão de estado em comparação com if-elseif-elseif-elseif-blocks é que ele permite estruturar melhor seu código.
fonte
Os estados não são ações, no seu jogo eles controlariam como o personagem é atualizado (por exemplo, cada estado pode ter sua própria função update ()).
Dê uma olhada no diagrama nesta página: http://en.wikipedia.org/wiki/State_diagram . Os estados nos dizem algo sobre o mundo (a porta está aberta ou fechada). As ações nos mostram o que leva o mundo de um estado para outro.
No seu caso, você pode ter estados como:
E a transição entre estados (os eventos / flechas entre estados) seria uma contribuição do jogador e reações ao mundo, como:
Cada estado precisa verificar se algum evento relevante ocorreu. Normalmente, isso é feito com instruções if.
O
hit by monster
evento seria acionado e faria a transição do jogador para oin pain
estado.O jogador faria a transição para o
in pain
estado novamente, onde é possível exibir o sprite "hit" que mostra o personagem caindo para trás.Você provavelmente não vai escapar de instruções if, mas pode evitar instruções profundamente aninhadas.
fonte