Padrões de Projeto em Games : Observer

Padroes-de-Projeto-em-Games-Observer

Atualmente há muito material na internet sobre Padrões de Projeto. Porém a maioria utiliza uma abordagem um tanto técnica, deixando a desejar nos exemplos e aplicabilidade. Para tentar repassar para vocês de uma forma mais clara, utilizarei uma metodologia milenar de ensino que considero muito eficiente. Ela é oriunda de okinawa no japão, trata da confiança entre o aluno e  professor e consiste em duas etapas – primeiro o conceito, completo e direto, em seguida sua implementação com exemplos práticos.

Sendo assim, utilizando a metodologia de ensino do Sr Miyagi, vamos comentar um pouco sobre o padrão de projeto Observer.

Este padrão pertence a categoria dos padrões comportamentais e é muito utilizado em API´s gráficas como Swing do Java.

Descrição: Define uma dependência uma-para-muitos entre objetos, de maneira que quando um objeto muda de estado todos os seus dependentes são notificados e atualizados automaticamente.

Analisando o diagrama acima, podemos perceber que o padrão consiste em duas classes principais: Observable (o observado) e Observer (quem observa). A classe Observable possui três métodos importantes:

  • Attach: Adiciona um observador.
  • Detach: Remove um observador.
  • Notify: Notifica todos os observadores chamando o método update em cada um deles.

Ao implementar uma classe Observable, o desenvolvedor normalmente implementará uma forma para o observador analisar o que foi alterado no estado da classe observada. Representado pelos métodos getState e setState no diagrama.

O processo consiste em um objeto (observado) disparar eventos de notificação para os objetos observadores poderem agir de acordo com essa mudança. Vamos analisar o diagrama de sequência para entender exatamente o fluxo.

A partir do diagrama acima, imaginemos dois objetos cadastrados como observadores de um outro. Por algum estimulo externo, o objeto observado tem seu estado modificado (1), sendo assim, o próximo passo será notificar os objetos que o observam através do método notify (1.1), que por sua vez, dispara o método update em cada um de seus observadores  passando uma referência de si mesmo como parâmetro (1.1.1 e 1.1.2). A partir deste ponto, os objetos observadores podem executar um getState para saber exatamente o que foi alterado no objeto em foco.

O uso mais comum em software deste padrão pode ser observado na linguagem Java através do uso de Listeners (outra forma de chamar os observadores). Para ouvir o teclado por exemplo, você deve cadastrar seu objeto como ouvinte do Keyboard e implementar vários métodos de notificação, tais como KeyDown, KeyPress, KeyReleased, etc. Quando o teclado é utilizado, a classe Keyboard envia notificações para todos os seus observadores passando informações sobre o evento.

Uso em Games: A utilização do padrão Observer em games é muito comum atualmente. O exemplo de software utilizado acima se encaixa como uma luva para os desenvolvedores de games, além claro que estender isso para mouse e joystick, que funcionariam exatamente da mesma forma. Além deste uso conhecido, o Oberserver pode ser utilizado com sucesso em arquiteturas de IA. Imaginem um inimigo, ou grupo de inimigos, observando as ações do jogador (player). A cada movimento dele, o grupo pode agir de uma forma ou de outra para criar uma emboscada.

Em um game como Mario, há um exemplo do clássico fantasminha que age de acordo com os movimentos do personagem. Se Mario olha em sua direção, ele se esconde e para, porém, se Mario olha na direção oposta, o fantasma se aproxima.

E ai, o que acharam desse nosso primeiro post? Procurei começar com um padrão mais simples para irmos aos poucos entendendo o todo. Aguardo o feedback de vocês para os próximos. ;)

Grande Abraço!

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.

6 Comentários em "Padrões de Projeto em Games : Observer"

  1. Marco 02/08/2010 at 17:25 - Reply

    Muito bem bolado o texto. Gostei do exemplo do Mario!

    Tenho tentado sempre que posso utilizar esses padrões em meus projetos, principalmente esse de observer que me parece ser muito útil quando bem aplicado.

    Estou acompanhando sempre que posso. Continuem assim :)

  2. Eduardo Nunes Pereira 15/04/2011 at 07:56 - Reply

    Vários inimigos de games que usam escudos, só podem ser atingidos quando estão atacando o player, o Observer é bem prático mesmo, dependendo do game são anexados centenas de observadores em uma simples fase.

  3. Eduardo Nunes Pereira 15/04/2011 at 07:58 - Reply

    Criei um repositório de designer patterns em C++ já faz um tempo se quiser ajudar a divulgar vai ser legal. http://code.google.com/p/cppatterns/ quem sabe podes ajudar na wiki dele.

    • everton.vieira 15/04/2011 at 09:34 - Reply

      Legal Eduardo!
      Já fica a dica do link aqui no post e comento mais sobre ele no próximo padrão de projeto ;)

  4. Daniel Monteiro 19/07/2011 at 12:41 - Reply

    As classes derivadas de Observer no primeiro diagrama não deveriam ter o nome “ConcreteObserverA” e “ConcreteObserverB” não?

    E realmente gostei da ideia do Sr. Myagy. Até hoje estou tentando pintar e escovar, pra ver se aprendo Karate.

    Nunca tinha realmente me ligado no exemplo do fantasminha…

    • everton.vieira 19/07/2011 at 22:04 - Reply

      Olá Daniel,

      Perfeita a sua observação.Erro de digitação corrigido ;)

Deixar um Comentário