Padrões de Projeto em Games – State

Olá gurizada,

Voltamos com mais um capítulo do arco sobre padrões de projeto aplicados a games. Desta vez, vou falar um pouco sobre o padrão State.

Da mesma forma que o padrão Observer, também da categorias de padrões comportamentais, o State é um dos mais utilizados pelos desenvolvedores de jogos. Sua arquitetura é perfeita para a implementação de agentes inteligentes em games. Vamos conhecer então um pouco sobre ele?

A definição formal deste padrão registra que ele permite um objeto alterar seu comportamento quando o seu estado interno muda. Esta mudança é significativa e vísivel para o usuário, assemelhando-se a troca de classe.

Para quem não está familiarizado com o termo em Orientação a Objetos,  o estado de um objeto é uma combinação dos valores atuais dos seus atributos.

Vejamos o diagrama de classes abaixo para entender a arquitetura deste padrão de projeto.

A classe Contexto faz referência a qualquer objeto que possua estados. Percebam que ela possui um atributo para armazenar o estado ativo. A Interface Estado tem por objetivo unificar o tipo de todo e qualquer estado do aplicativo. A Classe EstadoConcreto representa o estado em si, podendo haver vários em uma aplicação.

Na área de desenvolvimento de software é muito comum vermos o padrão State aplicado em editores gráficos – onde cada ferramenta possui um comportamento – um estado – bem específico. Por exemplo, o editor Photoshop pode ter vários estados, entre eles: Selecionar, Recortar, Pintar, Desenhar, Apagar, etc. Cada um destes estados possuirá as regras e comportamentos adequados a sua função. O diagrama de sequência abaixo ilustra este funcionamento.

É importante destacar que cada um dos objetos State deve armazenar todo o funcionamento a ele relacionado. Sendo assim, o PaintState, por exemplo, possui todo o código referente ao ato de desenhar na tela.  Esta abordagem é muito prática e modular, evitando que o desenvolvedor coloque todas as funcionalidades do aplicativo em um único local.

Conforme já comentamos, o padrão State é um dos mais utilizados em games. É através dele que o desenvolvedor consegue organizar o comportamento diversificado de uma personagem. Entre os vários games que eu poderia citar como exemplo, escolhi o Kid Chameleon – um dos melhores jogos do SEGA Mega Drive. Para os gamers mais novos, este era um jogo onde o personagem principal, através de máscaras escondidas no cenário,  podia assumir 10 personalidades. Entre elas estariam: Samurai, Cavaleiro, Tanque e até uma mosca. Percebam que cada “fantasia” possui uma peculiaridade bem específica. Desta forma, o padrão State caiu como uma luva – onde para cada personagem, haveria um objeto estado com as regras e comportamento para o personagem.

Nesta época a SEGA ainda caprichava em seus jogos :P . Curtam aqui um vídeo para matar a saudade deste clássico.

Alguma dúvida sobre o padrão State? Alguém se anima a indicar um outro game que claramente utiliza esta solução? Comentem :)

Até a próxima!

6 Responses to “Padrões de Projeto em Games – State”

  • Fabiano says:

    Caraca, começando segunda-feira matando a saudade do Kid Chamaleon!!! Que época irada da minha vida!! =)

  • Leandro Vian says:

    Muito bon esses posts, sempre é bom ter um exemplo desses pra ajudar na hora que se está projetando. sobre exemplos, me veio a mente aquelas “siege weapons” do age of empires, que basicamente no modo móvel era uma carrocinha que andava pelo mapa, e quando dávamos um deploy nela, ela mudava o comportamento, passando a atirar, ver mais longe e ficar estacionária.

    abraço

    • everton.vieira says:

      Olá Leandro,
      Perfeito o seu exemplo do Age of Empires. Para este tipo de comportamento, o State é muito eficiente.

  • Regis Machado says:

    Opa olá a todos do abrindo o jogo,

    Passando aqui rápido pra contribuir e comentar o post, que ficou muito bom por sinal.

    Apesar de a pouco tempo eu tido um contato maior com o padrão state, ele é muito bom e fica muito melhor combinando um os padrões strategy e specification numa arquitetura dirigida a eventos.

    por exemplo:

    -> podemos associar diversas estrategias de comportamentos para o estado baseado em eventos. Onde cada evento leva consigo a ‘especificação’ exigida para que ele possa ser processado por uma entidade de jogo.

    Então digamos que a entidade jogador está no estado pulando, quando nesse estado se apertado o botão ‘x’ ele da um segundo pulo, quando ‘y’ ele da um golpe pra diagonal esquerda inferior, quando apertado o ‘a’ é verificado que no estado pulando a entidade jogador pode dar um segundo pulo e quando no estado parado ou correndo poderia dar um ‘dash’ ou ‘double-dash’.

    Assim dependendo da interatividade exigida associar diversas estrategias baseadas em evento pra cada estado enriquece ainda mais esse excelente padrão que muito útil.

    Abração a todos.

  • Eu entrei no post, no início achando que haveria alguma relação com a criação de máquina de estados (states machine) para IA. Há alguma relação do padrão com AI mesmo ou AI se baseia em outro tipo de padrão (ou usa mais métodos e atributos, outro tipo de metodologia)? Abs

    • everton.vieira says:

      Olá Francisco,

      Sim, tudo a ver. O padrão de projeto STATE é uma arquitetura que permite a criação de Máquina de Estados. Conhecer bem o seu funcionamento, ajudaria muito durante a montagem de uma FSM para a I.A. de seus NPC´s.

Leave a Reply