[XNA] Lançamento Oblíquo no vácuo
Numa partida de golfe, um jogador bate na bola, inicialmente parada, colocando-a na em alguma área do campo, próximo ou distânte do buraco. O lançamento oblíquo estuda o movimento de corpos, lançados com velocidade inicial vo da superfície da Terra.
A trajetória é parabólica, como você pode notar na figura acima. Como a análise deste movimento não é fácil, é conveniente aplicarmos o princípio da simultaneidade de Galileu. Veremos que ao projetarmos o corpo simultaneamente no eixo x e y teremos dois movimentos:
- Em relação a vertical, a projeção da bola executa um movimento de aceleração constante e de módulo igual ag. Trata-se de um (M.U.V.) (lançamento vertical)
- Em relação a horizontal, a projeção da bola executa um (M.U.).
Exemplo no XNA:
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 texture;
Vector2 position;
Vector2 speed;
// Informação do ambiente
float gravity;
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
position = new Vector2(0.0f, 560.0f);
// Configura o valor da gravidade
gravity = 700.0f;
// Configura a velocidade inicial em X e Y
speed = new Vector2(320.0f, -800.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
texture = Content.Load<Texture2D>(@"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(texture, position, 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 time = (float)(gameTime.ElapsedGameTime.TotalMilliseconds / 1000.0f);
// Atualiza o movimento em X da bola
position.X += speed.X * time;
// Ataualiza a posição Y da bola
// S = So * t + (g * t*t)/2
position.Y += (speed.Y * time) + (gravity * (float)Math.Pow(time, 2)) * 0.5f;
// Atualiza a velocidade Y do objeto ( v = vo + g * t )
speed.Y += gravity * time;
// Verfifica se atingiu a velocidade máxima é 600.0f
speed.Y = (speed.Y > 600.0f) ? 600.0f : speed.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 no ponto (0, 560) com um velocidade constante horizontal de 320.0f pix/s. No eixo Y a bola sofre a ação da aceleração gravitacional retardando sua velocidade inicial de -800.0 pix/s fazendo com que em algum momento zere sua velocidade e comece uma queda livre.
Após compilar (F5) seu código sem erro é para você obter o seguinte resultado.
Para fazer download do projeto clique aqui.
Abraços e até a próxima

















