Padrões de Projeto em Games – Memento

Padroes-de-Projeto-em-Games-Memento

Olá pessoal, depois de deixar a bola um pouco com os novos colaboradores, volto a postar no Abrindo o Jogo.

Achei que uma boa forma de voltar seria dando continuidade ao arco de posts sobre padrões de projetos em jogos. Vários leitores pediram e a gente estava devendo os padrões restantes. Desta vez, falaremos sobre o padrão Memento, um dos mais divertidos e interessantes de todos que já vimos até agora. Ele é responsável pelos efeitos de Replay de praticamente todos os games, além de fazer parte da mecânica do game independente Braid, obra prima de Jonathan Blow. Então, vamos conhecê-lo.

As bibliografias técnicas para este padrão descrevem que ele, sem violar o encapsulamento, captura e externaliza um estado interno de um objeto, de maneira que este possa ser restaurado mais tarde. Em outras palavras, através de um objeto Memento, que armazena o estado de um objeto do jogo no tempo, seria possível restaurar este estado a qualquer momento.

Vamos analisar o diagrama que representa o padrão para conhecer as classes envolvidas:

Não entendeu? Não se assuste, vamos falar um pouco mais sobre a função de cada uma das três classes:

  • Care Taker (Responsável) : Este objeto cuidará do gerenciamento dos Mementos (memória do estado atual). Ela captura, armazena e restaura o estado do objeto Originator.
  • Memento (Memória, Lembrança):  É a classe que representa a memória do estado do objeto Originator.
  • Originator (Autor, Sujeito): É o objeto que terá seu estado armazenado e restaurado.

O Diagrama de sequência abaixo nos dará uma ideia mais detalhada de como os objetos se relacionam e a ordem do processo como um todo. Observe:

O processo é bem simples, composto por apenas quatro passos:

  1. O objeto responsável Replay, requisita um Memento ao objeto Tim (personagem do game Braid).
  2. O objeto Tim cria um Memento. É importante destacar que somente o próprio objeto é capaz de criar o seu Memento.
  3. O objeto Tim armazena no Memento o seu estado atual. Por exemplo, energia, posição, itens, etc. Em seguida, devolve o Memento ao responsável.
  4. Em determinado momento do game, o responsável pode setar o Memento no objeto Tim, fazendo com que ele recupere o estado que possuia a anteriormente.

Vamos ver o que a prática do Sr. Miyagy nos dá de exemplo prático para este padrão ;)

Através do processo descrito acima, bastaria criar um gerenciador que armazenasse em uma pilha o Memento de Tim a cada pulso do game. Ao pressionar a tecla de reverter o tempo, bastaria atribuir ao objeto os Mementos armazenados, também um a cada pulso.

Para um exemplo mais visual, contamos com o protótipo enviado pelo leitor, e grande amigo, Luis Otávio Ortiz. Ele utilizou o clássico game Asteroid para implementar um interessante efeito de voltar no tempo. Para que isso fosse possível, Otávio replicou o conteito deste post para todos os objetos presentes no game, confira abaixo no link.

Fasteroids

Controles:

  • Movimento: Setas
  • Tiro:Espaço
  • Voltar no Tempo: Basckspace

Acesso o Game aqui ou faça o download do projeto em FlashDevelop aqui.

Utilizem os comentários do post para enviar dúvias ;)

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.

3 Comentários em "Padrões de Projeto em Games – Memento"

  1. Eduardo Nunes Pereira 15/04/2011 at 13:18 - Reply

    Muito bom, aprovado, o replay muito usado em jogos de esporte, se consagrou no Braid como parte do jogo.

  2. Daltron 26/06/2011 at 22:38 - Reply

    Interessante, mas fiquei imaginando: a pilha de mementos não ficaria gigantesca em pouco tempo? Se entendi certo, ali no asteroids por exemplo, haveria um memento pra cada asteroide, cada tiro e pra nave. Além disso, mesmo os asteroides destruídos não poderiam ser liberados da memória. Como geralmente se trata isso?

    • everton.vieira 27/06/2011 at 20:59 - Reply

      Olá Daltron,
      Sim, para termos o resultado apresentado no exemplo, precisamos ter o memento de todos os objetos que existiram em algum momento no game. Dependendo da complexidade dos objetos, isso pode pesar sim. Porém, é importante lembrar que o memento deve clonar apenas o modelo do objeto, não armazenando nada referente a sua visualização ou controle.
      É bastante comum esta pilha ter uma tamanho limite para não comprometer o funcionamento do game. Em braid, por exemplo, ela faz parte da mecânica. Sendo assim, o programador precisa aplicar métodos de otimização para que o feature não comprometa o desempenho do game. Veremos logo um outro padrão que pode solucionar este problema ;)

Deixar um Comentário