Código para o jogo de exemplo de física em Jogos

Publicado: 02/08/2005 em IntoSpaces

Olá Pessoal!!!
Que bom que vocês gostaram do personagem do jogo do último post eheheh parece que ele é bastante carismático, também com toda aquela expressão, impossível não ser né? eheheheh >_<‘

Bom antentendo aso pedidos e para sanar as dúvidas aqui vai o código para o joguinho:

O código está escrito em ActionScript, linguagem que o Macromedia Flash utiliza para extender suas funcionalidades de apresentação. A propósito o cenário do Flash pode ser muito bom para entendermos como os jogos funcionam, mas isto é para outro dia ok?

Antes de tudo precisamos criar dois MovieClips e instanciá-los(arrastá-los) na cena principal.

O primeiro contém o nosso personagem;
O segundo contém o chão, e deve ter o nome de instância como ground;
Também colocamos alguns "labels" para podermos mostrar as informacoes.

Agora vamos ao código do nosso personagem, na verdade toda a trama acontece nele nesta demonstração.

No evento Load do nosso MovieClip inicializamos 3 variáveis:
vel_y -> Velocidade do movimento vertical do nosso personagem
jumping -> Indica se ele está pulando
walking -> Indica se ele está parado

onClipEvent(load)
{
 vel_y = 0;
 jumping = false;
 walking = false;
}

Sem segredos né?
Notem que a maneira de se estrutura o código, fora os eventos é muito parecida com C#

Agora vamos ao evento EnterFrame.
Este evento é lançado ao passar pelo quadro em questão, como não manipulamos mais de 1 quadro no nosso Filme este quadro será repetido exaustivamente, e é aí que nosso jogo entra.

Primeiro deixamos o personagem por padrão sem o movimento de andar.
 
onClipEvent(enterFrame)
{
 walking = false;

Agora é a hora de verificar as teclas precionadas.
Primeiro verificamos se a barra de Espaço esta pressionada e se o nosso personagem jã esta pulando, se não estiver setamos a velocidade vertical dele para 10(altere este valor para variar o movimento), dizemos que agora ele está pulando e colocamos no nosso label direction, colocamos o Left nele para iniciar somente, depois colocamos a direção correta.

 if (Key.isDown(Key.SPACE) && !jumping)
 {
  vel_y = 10;
  jumping = true;
  _root.direction.text = "Left";
 }

Agora verificamos se a tecla da seta para a esquerta esta pressionada e se sim, analisamos se ele só esta pulando ou andando e diminuimos as coordenadas _x do nosso personagem, fazendo com que ele se mova para as esquerda.
A verificação da posição é para sabermos se ele está sobre a terra (ground) ou não.

 if (Key.isDown(Key.LEFT))
  {
 
   _root.direction.text = "Left";
  if(!jumping)
  walking = true;

   if(!walking)
     this._x -= 2
   else
   {
    if(this._x > 61.4)
    this._x -= 2
   }
  }

Se nossa seta esquerda nao estiver pressionada, talvez a da direita possa estar. Então fazemos a mesma verificação para a seta anterior.

  else if( Key.isDown(Key.RIGHT))
   {
    _root.direction.text = "Right";
  if(!jumping)
    walking = true;
 
  if(!walking)
     this._x += 2
   else
   {
    if(this._x < 227.5)
    this._x += 2
   }
   }
 
Alguma semelhança de sintaxe com C/C++/C# até agora?
Agora vamos ver se o nosso personagem está pulando, pois se estiver precisamos colocar a nossa lógica de gravidade nele!! O_O
Bom até agora quando pressionamos a barra de espaço nosso personagem ficou com força 10 para o seu pulo, agora vamos fazer com que esta força diminua gratativamente simulando a ação da gravidade no seu corpo, puxando o para baixo.
Para isso diminuimos 1 na sua força a cada vez que o codigo passar por aqui.

Lembrem-se é um loop infinito que ocorre e ele entrará neste bloco de código enquanto a condicao jumping for verdadeira.

Verificamos aqui também se a velocidade da queda (valor negativo da velocidade vertical) é -10, se for limitaremos a velocidade neste valor para ele não tenha uma queda em velocidade acentendemente infinita.

Atualizamos a posição _y do nosso personagem e verificamos se ele saiu dos limites do nosso filme (300×300), fazendo com que ele reapareça no topo, tornando-o assim, invencível

 if (jumping)
 {
  vel_y -= 1;
  if (vel_y <= -10) vel_y =- 10;
  this._y -= vel_y;
  if(this._y > 300)
  {
   this._y = -15;
   this._x = 153.3;
  }
 }
 
Bom agora que já atualizamos a posição do nosso personagem verificamos a colisão dele com o chão(nosso moviel clip chamado ground).
A função hitTest do MovieClip faz isso pra nós, só precisamos passar as coordenadas de nosso personagem que ela faz a comparação.
Veja a documentação do ActionScript para maiores detalhes sobre a função.
Se ele colidir com a terra ele não estárá mais pulando e sua velocidade vertical(_y) será nula.
Consideramos aqui que o nosso Ground atua como uma força contrária à da gravidade, agindo sobre o personagem e anulando a sua inércia, consequentemente deixa de cair 😉
 
 if (_root.ground.hitTest(this._x, this._y+15, true))
 {
  vel_y = 0;
  jumping = false;
 }

Agora Colocamos aqui em nossos labels várias informações sobre o estado atual do personagem, primeiro sua posição e depois se ele está andando.
Notem que se ele nao esta andando nem pulando ele só pode estar parado, pois ele não se abaixa nem correm nem nada.

 _root.position.text = "{" + this._x + "," + this._y + "}";
 if(walking) _root.action.text  = "Walking";
 else if (jumping) _root.action.text = "Jumping";
 else _root.action.text  = "Waiting";
}

Ufa!! É isso!!
Eu fiz isto em Flash para ficar melhor para mostrar na web, porém o que importa aqui é o algoritmo, o que faz com que fique fácil portar para outras plataformas, C# + DirectX no caso, porém é necessário construir o laço principal do jogo, o que o ambiente do Flash já faz pra nós!!!

Interessante não? Como já disse anteriormente baseei-me em um artigo, em inglês.
http://www.unidev.com.br/forum/topic.asp?TOPIC_ID=20588

Post com o Jogo funcionando
http://br.thespoke.net/MyBlog/shinji/MyBlog_Comments.aspx?ID=28071

Arquivos do "jogo"
.Fla -> Contém todo o conteúdo para edição do Filme no Flash
.Swf -> A animação final

[]’s
Shinji

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s