Padrões de Projeto em Games – State

Padroes-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 categoria 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. Então vamos conhecer 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 são os 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 State com as regras e comportamentos 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!

Autor: Everton Vieira Ver todos os posts de
Sou Bacharel em Análise de Sistemas pela Universidade Católica de Pelotas (UCPel) no ano de 1999. Minha paixão por games é de longa data. Porém, em 2003 tornei essa paixão uma profissão. Durante oito anos atuei como Game Designer e Arquiteto de Software em mais de 30 projetos de Serious Games (simuladores) para grandes empresas do país. Atualmente sou sócio-fundador da Izyplay Game Studio, onde exerço o cargo de Diretor de Criação. Além do envolvimento corporativo, também participei da organização da Pós Graduação em Arquitetura e Desenvolvimento de Jogos Digitais na FATEC SENAC Pelotas. Minha área de interesse e especialização é Game Design e Inteligência Artificial.

9 Comentários em "Padrões de Projeto em Games – State"

  1. Fabiano 15/08/2011 at 08:41 - Reply

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

  2. Leandro Vian 15/08/2011 at 11:29 - Reply

    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 15/08/2011 at 11:53 - Reply

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

  3. Regis Machado 15/08/2011 at 14:19 - Reply

    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.

  4. Francisco Prado 29/04/2012 at 10:02 - Reply

    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 29/04/2012 at 19:39 - Reply

      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.

  5. Michell 20/08/2013 at 14:53 - Reply

    Muito bom esses artigos sobre padrões de projeto!
    Acredito que um outro exemplo do State seria o jogo Metal Slug. Onde cada arma que o jogador recebe no cenário possui munição/características diferentes.

    Parabéns pelo artigo.

  6. Artur 17/08/2015 at 12:47 - Reply

    Boa tarde.

    Excelente post! Adorei reviver o Kid Chameleon.

    Eu tenho uma dúvida mas acredito que é mais voltada para a programação em si, pois sou novo nesse meio. Apesar de já programar e manipular bem o c# dentro da Unity, não entendi como manipular (salvar) os STATES, você poderia me dar um exemplo? Seria melhor utilizar enums ou métodos ou alguma outra forma de guardar esses atributos referentes a um state?
    Caso não seja o local adequado para se perguntar este tipo de coisa, agradeço mesmo assim a oportunidade :)

    Obrigado.

    • Everton Vieira 18/08/2015 at 09:13 - Reply

      Olá, Artur! Tudo bem?

      O local para as dúvidas é aqui mesmo :)
      Os states na verdade são classes que definem um comportamento. Você pode já criar todos os objetos de estados e armazená-los em uma lista indexada comum. Pode ser inclusive um Dictionay. Escolha pela facilidade de indexação. É legal também criar método específicos para manipular os estados onde este garante que desativa o estado anterior e ativa o novo estado. Ficou mais claro? Caso contrário poste aqui as dúvidas ;)

Deixar um Comentário