|
Vejamos agora o movimento de um corpo lançado verticalmente para cima, com uma velocidade inicial vo. Desprezando a resistência do ar, observamos que, à medida que ele sobe, sua velocidade vai diminuindo uniformemente até tornar-se nula, instante em que tem início a sua queda livre. O código deste tutorial foi criado e testado no XNA 4.0, ou seja, qualquer mudança de versão pode acarretar ou não em reajustes no código.
Durante a subida, o movimento é uniformemente retardado, pois o vetor velocidade e o vetor aceleração possuem sentidos contrários; durante a descida, o movimento é uniformemente acelerado (queda livre).
Um modo prático para testarmos esse movimento é utilizar o mesmo programa de queda livre, porém iremos colocar uma velocidade inicial contrária a aceleração da gravidade, veja como fica nosso exemplo.
Exemplo no XNA
O exemplo mostra a gravidade atuando sobre um objeto. A gravidade foi definida como 400 pix/s² e a velocidade inicial como 440 pix/s em Y e zero em X. No método Update é feito uma atualização na posição Y do objeto e na velocidade Y do mesmo. A última operação da rotina garante que a velocidade não será maior que 300 pix/s, simulando assim o equilíbrio entre a gravidade e o atrito que o corpo sofreria.
1º passo: Crie um novo projeto (Windows Game) e crie variáveis para armazenar a posição, velocidade, gravidade e textura do objeto.
// Informações da bola Texture2D imagem; Vector2 posicao; Vector2 velocidade; // Informação do ambiente (gravidade = g) float gravidade;
2º passo: Inicialize a posição do objeto e defina a sua velocidade inicial e a aceleração da gravidade do seu ambiente que será constante, tudo isso dentro do método Initialize()
protected override void Initialize()
{
// Inicializa a posição da bola
posicao= new Vector2(360.0f, 500.0f);
// Configura o valor da gravidade
gravidade= 400.0f;
// Configura a velocidade inicial em X e Y
velocidade = new Vector2(0.0f, -440.0f);
base.Initialize();
}
3º passo: Copie a textura abaixo ou outra imagem de sua preferência para você carregar e aplicar a queda livre
protected override void LoadContent()
{
// Create a new SpriteBatch, which can be used to draw textures.
spriteBatch = new SpriteBatch(GraphicsDevice);
// Carrega a textura da bola
imagem = Content.Load(@"ball");
}
4º passo: Vamos desenhar a imagem na tela
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
spriteBatch.Begin();
// Desenha a bola
spriteBatch.Draw(imagem, posicao, Color.White);
spriteBatch.End();
base.Draw(gameTime);
}
5º passo: Para concluir vamos aplicar a fórmula descrita no nosso objeto
protected override void Update(GameTime gameTime)
{
// Tempo passado desde a ultima atualização
float tempo = (float)(gameTime.ElapsedGameTime.TotalMilliseconds / 1000.0f);
// Atualiza a posição Y da bola
posicao += velocidade * tempo;
// Se não atingiu a velocidade máxima, sua gravidade (h = vo * t + (g * t*t)/2)
posicao.Y += (velocidade.Y * tempo) + (gravidade* (float)Math.Pow(tempo, 2)) / 2.0f;
// Atualiza a velocidade Y do objeto ( v = vo + g * t )
velocidade.Y += gravidade * tempo;
// A velocidade máxima é 300.0f
velocidade.Y = (velocidade.Y > 300.0f) ? 300.0f : velocidade.Y;
base.Update(gameTime);
}
Com esta rotina é chamada a cada laço do jogo, o que será exibido na tela é um objeto (bola) que inicia seu lançamento vertical com -440 pix/s (lembrando que o sinal de negativo é por causa do sistema de coordenadas utilizado nos jogos) contra uma aceleração de gravidade de 300 pix/s². Quando a bola chega a velocidade zero, ela começa uma queda livre e pára de acelerar quando atinge a velocidade de 300 pix/s.
Resultado
Após compilar (F5) seu código sem erro é para você obter o seguinte resultado.
Download
Para fazer download do código criado neste tutorial, clique no ícone de download abaixo.













