por Fernando Lorenzon em 13/01/2010 as 19:53

Aqui serei mais teórico.

Como aplicar física em jogos?
1 - Usando uma boa engine que já faça isso;
2 - Usando boas bibliotecas que façam isso;
3 - Manifestando um pouco do Newton que há dentro de nós;

Como a idéia toda desta série é entender como tudo funciona, e não simplesmente criar um jogo o mais rápido possível, ficaremos com a terceira opção. Apesar de eu gostar de física, nunca estudei muito tal disciplina, e hoje sinto bastante dificuldade com vários cálculos básicos. Graças ao jogo em si, eu consegui redescobrir muitas coisas, pois na prática é mais fácil de entender um conceito.

Vamos:

A Física, entendida por muitos estudantes como a abreviação da disciplina "Educação Física", não é chutar uma bola e marcar um gol, e sim calcular sua tragetória, peso, velocidade, aceleração e etc.

Para quem quer criar jogos de RPG, ignorem tudo isso. Para os demais, vamos analisar algumas coisas:

Num fluxo de jogo, não basta aplicar uma fórmula para deslocar um objeto para outro lugar. É preciso MOVER o objeto um pouco a cada update.

Como o fluxo é contínuo, você não deve prever onde os objetos estarão, e sim mover os objetos na direção que a fórmula deve prever. Complicado?

Quando aplicamos uma fórmula para descobrir a aceleração ou velocidade de um corpo, o que obtemos é o valor em distância/tempo (km/h, m/s, mph, etc...). Se temos a velocidade e multiplicarmos pelo tempo, obteremos a posição onde o corpo estará.

Mas para um sprite se mover, temos que reposicioná-lo a cada Update. Como num jogo 2D comum temos pixels, e aqui temos nosso Update() disparado por Timer.Tick() a cada 20 milisegundos, nossa velocidade é medida em pixels por tick.

Ou seja, se um sprite se desloca com uma velocidade de 1 p/t (pixel por tick), e um tick é disparado a cada 20 milisegundos (resultando em 50 ticks por segundos), temos a velocidade de 50 pixels por segundo.

Numa tela de jogo de 640 pixels de largura, o sprite demoraria 13 segundos para atravessá-la completamente.

Definindo um pouco as coisas:

Velocidade: é a taxa mudança de posição de um corpo ao longo do tempo. Se a cada tick temos a mudança de posição em 1 pixel, nossa velocidade é 1 p/t (não existe essa medida, e nem adianta sugerir à SI).

Aceleração: é a taxa de aumento de velocidade num determinado período de tempo. Se no primeiro tick temos 1 p/t, e no próximo temos 2 p/t, no terceiro estaremos com a velocidade acumulada do primeiro somado do segundo (1 + 2).

A cada tick o sprite pulará mais pixels de uma vez:

Ticks:    |
Pixels:   +

|+|++|+++|++++|+++++|++++++|

Como representar isso?

Simples. É só criarmos uma variável para acumular a velocidade e somá-la aos pixels que representam a localização dos sprites.

No exemplo da bola na parte 3, nós movíamos a bola em um pixel a cada tick quando o jogador mantinha uma seta pressionda. Agora vamos acrescentando unidades em uma variável e transferiremos o valor total dela no Location do sprite:

C:
  1. //Declarar como global
  2. int vel = 0;
  3.  
  4. if (this.ks.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Left))
  5. {
  6.     vel = vel - 1;
  7. }
  8.  
  9. if (this.ks.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Right))
  10. {
  11.     vel = vel + 1;
  12. }
  13.  
  14. this.pictureBox1.Location =
  15. new Point(this.pictureBox1.Location.X + vel, this.pictureBox1.Location.Y);

o que estamos fazendo acima é:

1 - Criar uma variável para armazenar velocidade;
2 - Adicionar ou subtrair unidades a ela dependendo da direção esquerda/direita (velocidade na direção oposta é negativa)
3 - reposicionar o pictureBox acrescentando a velocidade à sua posição no eixo X atual;

Execute e veja como para os lados a bola possui aceleração, velocidade e inércia. Enquanto para cima e para baixo ainda se move do jeito antigo.

Aqui vai o código completo da tela: link

Parte 5 - Colisão Simples

Tags: , , , ,
Categorias: Desenvolvimento | No Comments »


Deixe um comentário