Kléber de Oliveira Andrade
Lançamento Oblíquo no Vacúo (XNA)Imprimir
Escrito por Kleber Andrade

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. 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.

Fonte da imagem: http://www.ciencia-cultura.com/Pagina_Fis/vestibular00/vestibular_CinematEscalar010.html

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:

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 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(0.0f, 560.0f);
      // Configura o valor da gravidade
      // O valor da gravidade em jogos é um valor que fique
      // aparentemente bom dentro do seu jogo
      gravidade = 700.0f;
      // Configura a velocidade inicial em X e Y
      velocidade = 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
     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 o movimento em X da bola
      posicao.X += velocidade.X * tempo;
      // Ataualiza a posição Y da bola
      // S = So * 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;
      // Verfifica se atingiu a velocidade máxima de 600.0f pixels/segundos
      velocidade.Y = (velocidade.Y > 600.0f) ? 600.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 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.

Resultado

Após compilar (F5) seu código sem erro, você vai obter o seguinte resultado.

Download

Para fazer download do código criado neste tutorial, clique no ícone de download abaixo.

image


Comentários (3)
  • Anônimo
    avatar

    SUA MAE

Escrever um comentário
Your Contact Details:
Gravatar enabled
Comentário:
[b] [i] [u] [url] [quote] [code] [img]   
:angry::0:confused::cheer:B):evil::silly::dry::lol::kiss::D:pinch::(:shock:
:X:side::):P:unsure::woohoo::huh::whistle:;):S:!::?::idea::arrow:
Security
Por favor coloque o código anti-spam que você lê na imagem.
LAST_UPDATED2