terça-feira, 11 de setembro de 2012

A lógica do jogo de labirinto (Game Maker)

Esta postagem irá comentar sobre a implementação do jogo de labirinto no Game Maker que disponibilizei no blog nesta postagem:
Jogo de Labirinto no Game Maker

O foco do artigo será na lógica dos Eventos e Ações dos Objetos do jogo.

O principal Objeto é o "jogador". A imagem abaixo mostra os Sprites que o "jogador" utiliza, sendo um Sprite para cada direção.


Cada um desses Sprites possui quatro quadros de animação (subimagens), como pode ser visto no "Sprite Editor":


Os eventos do "jogador" são os seguintes:


O movimento do "jogador" é baseado nos blocos de 32x32 do labirinto. Sendo assim, as setas do teclado só irão responder quando o jogador estiver alinhado ao labirinto. A imagem abaixo mostra as ações que são executadas quando a Seta para Direita é pressionada.


A ação "Change Sprite" possui os seguintes parâmetros:


O valor "-1" no campo subimage, significa que o valor atual da subimagem não deve ser alterado para que não atrapalhe a animação do personagem.

O valor "1/3" no campo speed representa a velocidade da animação. Se o valor fosse 1 então a cada passo (step) a subimagem do sprite seria modificada. Como temos poucos quadros na animação do sprite, queremos que a subimagem seja alterada a cada 3 passos, ou seja, a velocidade de animação será 1/3. É bem mais simples representar a velocidação de animação usando frações ao invés de usar o ponto como em: "0.3333".

O evento "Alarm 0" do jogador foi criado por dois motivos. Um dos motivos é reunir em um único lugar as Ações que devem ser executadas no final do jogo, ao invés de repeti-las em diversos outros Eventos. O outro motivo é fazer com que a tela do jogo seja desenhada pelo menos uma vez após a derrota do jogador, para que imagem do jogador seja trocada antes do jogo parar.

No jogo, os Eventos que acionam o "Alarm 0" são as colisões com os objetos "monstro" ou "explosão". Ambos iniciam o "Alarm 0" com o valor de 1, para que já seja executado no próximo passo.

As ações que são executadas no "Alarm 0" são as seguintes:


Quando o jogador pressiona a barra de espaço, é colocada na tela uma instância do objeto "dinamite". No evento Create, a dinamite cria um Alarme com o valor de 100 passos. Como o jogo está rodando a 30 passsos por segundos, o tempo que irá demorar para a dinamite explodir será de 3,33 segundos. Quando o Alarme dispara, são criados 5 instâncias do objeto "explosão", sendo uma no centro e mais 4 nas posições adjacentes. A imagem abaixo mostra as ações.


Com um propósito didático criei um objeto chamado "pai_destrutivel". É um objeto bem simples que possui apenas um evento de colisão com o objeto explosão. Neste evento a instância atual é destruída. A idéia é que todos os objetos do jogo que possam ser eliminados por uma explosão (exceto o jogador) sejam filhos do objeto "pai_destrutivel", herdando todos os eventos criados no objeto "pai_destrutivel". Este conceito é chamado de "Herança" e é muito utilizado na Programação Orientada a Objetos.

Como exemplo temos o objeto "Monstro". Na propriedade "Parent" está atribuído o objeto "pai_destrutivel". A imagem abaixo mostra as propriedades do objeto "Monstro".


Quando um "Monstro" colide com um bloco, parede ou dinamite, ele precisa escolher uma nova direção para se mover. É atribuída uma nova direção para o "Monstro" e logo em seguida é verificada se a posição para onde o "Monstro" iria se mover no próximo passo está livre. Se estiver livre então o evento é encerrado com o uso da ação "Exit this Event". Caso não esteja livre, são testadas outras direções. A imagem abaixo mostra estas ações.


Estas mesmas ações são repetidas em 3 eventos: Colisão com objeto bloco; Colisão com objeto parede e Colisão com objeto dinamite. Esta é uma boa opção para converter essas ações em um script que seria apenas chamado nos 3 eventos.

O cenário do jogo é feito de uma forma bem simples. É desenhada uma cor de fundo azul e são usados os objetos parede (nas bordas) e bloco para montar o labirinto. A edição do cenário é feita com o uso da grade que foi configurada para a dimensão 32x32. Todos os objetos estão alinhados a esta grade.


Nenhum comentário:

Postar um comentário