8 de outubro de 2014

Máquina de Estados Finitos

A Máquina de Estados Finitos é um conceito de programação modular utilizado para melhorar a organização tornando os códigos mais "limpos", a fim de evitar o aparecimento de bugs e facilitar a correção dos  mesmos. Este tutorial tem como objetivo explicar como funciona uma MEF (Máquina de Estados Finitos) e ensinar a aplicá-la em seu jogo.

Provavelmente muitos já utilizam este método sem nunca ter lido sobre, como é o meu caso, mas acabam não percebendo quanto isso pode ser útil se usado mais frequentemente.

Uma MEF nada mais é do que limitar seu objetos a uma certa quantidade de estados e descever seu comportamento para cada um deles. O objeto deve estar sempre em um estado, nunca mais nem menos que isso.

Segue um exemplo do jogo que estou programando.

switch estado
{
case fora_de_combate:
    if keyboard_check_pressed(vk_space)
    {
        estado = combate
    }
break;
case combate:
    if keyboard_check_pressed(vk_space)
    {
        estado = fora_de_combate
    }
    if mouse_check_button_pressed(mb_left)
    {
        estado = usar_mao_esquerda
    }
    if  mouse_check_button_pressed(mb_right)
    {
        estado = usar_mao_direita
    }
break;
}

Quando pressionar a barra de espaço meu código realizará a troca de estados entre "combate" e "fora_de_combate". Quando no estado "combate", se o botão direito do mouse for pressionado o personagem entrará no estado "usar_mao_direita".

No meu jogo o personagem movimenta-se diferentemente quando em "combate" e "fora_de_combate". Utilizando os estados referentes às maos do personagem posso fazer com que ele use sua espada para golpear, mas, caso leve um golpe enquanto está golpeando, algo aconteça diferente de como aconteceria se levasse o golpe enquanto estivesse no estado "fora_de_combate".

Visto que minhas ações de movimentos estão nos estados de "comabate" e "fora_de_combate", o personagem ficará impossibilitado de mover-se enquanto realiza um golpe, a menos que eu decida que ele deve mover-se, assim poderia simplesmente escolher qual tipo de movimento gostaria que ele tivesse e colocar dentro do estado "usar_mao_direita". Outra vantagem de utilizar este método é a otimização da execução de códigos, visto que somente os códigos do atual estado serão executados.

A correção de bugs também fica extremamente simples quando sabemos exatamente em que estado o bug ocorreu. Se o jogo reportou um erro enquanto eu subia no cavalo, é bem provável que o erro esteja no estado de transição que seria "subindo_no_cavalo" ou no estado "cavalgando"; não haveria necessidade de olhar os códigos dentro dos estados "andando", "sentado" e "dormindo".

Sempre que possível, tente definir estados para o seu código e verá como tudo ficará mais simples.

Nenhum comentário :

Postar um comentário