Atividade 11 - Máquina de estados finitos

Enunciado:
"Discutir o uso de MEFs como base na implementação de um jogo onde um personagem, visto de cima, caminha por um mundo simples, podendo virar-se em duas direções (esquerda e direita), com imagens à sua escolha."
Exemplo de máquina de estados finitos
01 - Conceito
Uma máquina de estados finita (MEF) é um modelo matemático no qual uma máquina abstrata deve conter um número finito de estados, estando em apenas um estado por vez que é denominado de estado atual. Esse modelo é muito poderoso para facilitar o código tornando o sistema simples, pois o mesmo utiliza basicamente de ifs, elses e temporização em alguns casos.
02 - Aplicação
Utilizei dos sprites abaixo, encontrados no site opengameart.org, para criar minha aplicação:
 Clique aqui para fazer download dos sprites
Escolhi eles porque além de serem top view, pré-requisito para a atividade, eles estão em boa resolução e são bem feitos!
Irei utilizar a engine GameMaker 1.4, pois já tenho conhecimento da mesma e o resultado ficará bem orgânico. No final da atividade irei postar tanto o executável como o projeto do GameMaker contendo o código da máquina de estados finita que pode ser aplicado no processing ou qualquer plataforma!
Defini o tamanho da room no GameMaker com dimensão de 1024 x 768, rodando a 60 frames por segundo.
Para ilustrar melhor os estados do personagem, fiz um grafo que representa justamente a máquina de estados finita:
Valores dos estados:
- Parado(inicial): 0
- Andando para direita: 1
- Andando para esquerda: 2
Depois de estabelecer esses estados no GameMaker, criei as variáveis key_right e key_left para receber o input da seta direita e esquerda, respectivamente.
É importante ressaltar que a função usada(keyboard_check) para receber o input das setas, retorna um inteiro sendo este 0 ou 1:
- 0: se a tecla não foi apertada ou não está sendo pressionada
- 1: se a tecla foi apertada ou está sendo pressionada
Logo, criei uma variável chamada move recebendo a soma da key_right e key_left. A máquina de estados finitos funciona com base nessa variável, sendo:
-> 0: estado parado
-> 1: andando para direita
-> -1: andando para esquerda
Porém, ainda há o problema de que quando eu solto a seta da esquerda, por exemplo, o sprite parado volta pro padrão que é parado para direita. Para resolver esse problema eu criei uma variável chamada lastface, que pode receber 0 ou 1 caso a face do personagem esteja virado para direita ou esquerda, respectivamente. Ai no meu estado parado, dependendo do valor dessa variável, meu sprite vai ficar parado para direita ou para esquerda. E o resultado fica assim:

Comentários