Controlando o estado de entidades no seu jogo usando maquinas de estado com GKState.

É muito comum que no desenvolvimento de um jogo seja necessário o controle de estado de um determinado personagem, e normalmente fazemos isso usando valores booleanos. Essa abordagem aumenta a complexidade do código e não muito raramente introduz bugs.

Por sorte nossa, esse é um problema comum e o Gameplay Kit oferece uma classe que nos auxilia a manter o controle de estados da nossa aplicação. Esse tipo de controle é algo que chamamos de máquina de estados.

Vamos imaginar um cenário onde temos um personagem que pode pular, andar e correr. Mas queremos que ele obedeça algumas regras, como por exemplo, quando ele estiver pulando, ele não pode conseguir correr, afinal ele está no ar 😉.

O primeiro passo para trabalhar com máquinas de estados é ter os estados bem definido. É bastante comum o uso de diagramas para definir cada estado e a transição entre os estados. Abaixo segue um diagrama da máquina de estados do nosso personagem.

Ramires Moreira — máquina de estados

O que temos que fazer agora é traduzir os nossos estados para código. Vamos utilizar a classe GKState para descrever cada estado, e a classe GKStateMachine para criar a nossa máquina de estados.

A classe GKState é super simples. Abaixo você pode ver a definição da classe GKState.

GKState definition

Criando nossa máquia de estados.

O primeiro passo é criar a definição de cada estado.

Depois basta que criar a máquina de estados.

Veja que criar uma máquina de estados é super simples, basta passar todos os estados que nossa máquina pode ter. A chamada do método
enter(_ state: GKState) faz com que a máquina mude de estado. A mudança pode ocorrer ou não, isso vai depender das regras implementadas.

Conclusão

Podemos considerar que o State é um pattern, e que não é necessário somente em jogos, mas é muito comum em jogos. O Gameplay Kit oferece ferramentas super amigáveis para trabalhar com esse pattern. Em um primeiro instante pode parecer desnecessário, e que tudo poderia ser feito com if e else, mas como já falamos antes, isso pode introduzir bugs na aplicação e aumentar a complexidade de leitura e manutenção do código.

Resources

--

--