Ponto V!

Home Matemática e Física Movimento Retilíneo Uniforme (MRU) - XNA
Kléber de Oliveira Andrade
Movimento Retilíneo Uniforme (MRU) - XNAImprimir
Escrito por Kleber Andrade

Este tutorial tem por finalidade desmistificar a programação do Movimento Retilíneo Uniforme (MRU) visto na física lá no ensino médio. Matéria que muitos aprendem e esquecem com o tempo o conceito. Este tipo de movimento é aquele em que os objetos se movem com velocidade constante (foi usado em nosso tutorial do jogo Pong). Tal conceito significa que, quando um objeto está em MRU ele não possui aceleração e que a determinação de sua posição depende apenas de sua velocidade e do tempo do intervalo. 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.

Observe no exemplo que o rapaz percorre espaços iguais em tempos iguais:

Ele leva 2 segundos (s) para percorrer 10 metros (m), ou seja, quando está a 10m se passaram 2s, quando está em 20m se passaram 4s e assim sucessivamente, de tal forma que se calcularmos sua velocidade em cada uma das posições descritas (comparadas com a posição inicial), teremos:

Para determinar a posição do objeto,neste movimento, devemos utilizar a função horária do MRU segundo a qual a posição atual de um objeto (S) é a sua posição inicial (So) mais a multiplicação de sua velocidade (v) pelo tempo do intervalo (t)

S = So + v * t

Como a velocidade é constante, deve ser definida no início do movimento e o intervalo de tempo (em segundos) é informado pelo gerenciador de tempo (GameTime) do XNA a cada atualização.

Exemplo

Segundo essa fórmula para determinar a posição do objeto é só calcular a distância que o objeto percorreu (v * t) e somar o resultado a sua posição. No exemplo a seguir, é definido uma velocidade de 150 pixels / segundo (pix/s) que será aplicada sobre o objeto no eixo X.

Prática no XNA

1º passo: crie um novo projeto (Windows Game) e crie variáveis para armazenar a posição, velocidade e textura do objeto.

// Informações do carro (pode ser colocado em uma classe específição)
private Vector2 posicao;
private float velocidade;
private Texture2D imagem;

2º passo: Inicialize a posição do objeto e defina a sua velocidade que será constante, tudo isso dentro do método Initialize()

protected override void Initialize()
{
    // Posição inicial do carro
    posicao = new Vector2(0.0f, 300.0f);
    // Configura a velocidade do carro
    velocidade = 150.0f;
    base.Initialize();
}

3º passo: Copie a textura abaixo ou outra imagem de sua preferência para você carregar e aplicar o MRU.

protected override void LoadContent()
{
    // Create a new SpriteBatch, which can be used to draw textures.
    spriteBatch = new SpriteBatch(GraphicsDevice);
    // Carrega a textura do carro (car.png)
    imagem = Content.Load¨lt;Texture2D>(@"car");
}

4º passo: Vamos desenhar a imagem na tela

protected override void Draw(GameTime gameTime)
{
     GraphicsDevice.Clear(Color.CornflowerBlue);
     spriteBatch.Begin();
     // Desenha o carro
     spriteBatch.Draw(imagem, posicao, Color.White);
     spriteBatch.End();
     base.Draw(gameTime);
}

5º passo: Para concluir vamos aplicar a fórmula descrita no nosso objeto carro e fazer ele se deslocar pela tela.

protected override void Update(GameTime gameTime)
{
     // Tempo passado desde a ultima atualização
     float tempo = (float)(gameTime.ElapsedGameTime.TotalMilliseconds / 1000);
     // Atualiza a posição do carro
     // S = So + V * T
     posicao.X += velocidade * tempo;
     base.Update(gameTime);
}

Com esta rotina é chamada a cada laço do jogo, o que será exibido na tela é um objeto (carro) se deslocando no eixo X com velocidade constante de 100 pix/s. Um objeto que se desloca com essa velocidade levaria 5,33 segundos para atravessar uma tela com 800 pixels de largura.

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 (4)
  • Vitor Almeida da Silva  - Muito bom!
    avatar

    Parabéns Kleber,

    Estes tutoriais com exemplos práticos e 1 conceito por vezes são bem acessíveis.

    Tomei a liberdade de implementar o mesmo conceito utilizando a Unity (pro pessoal que utiliza, já que é bem simples):

    --------------------
    1 - crie uma cena simples com um cubo
    2 - insira um script chamado "MovimentoRetilineo.js" no cubo
    3 - insira o código abaixo:

    var velocidade : float = 150.0f;

    function Update() {
    // Tempo passado desde a ultima atualização
    var tempo : float = Time.deltaTime / 1000;
    // Atualiza a posição do cubo
    transform.position.x += velocidade * tempo;
    }

    --------------------

  • Kleber Andrade
    avatar

    Por nada Vitor, essa é a idéia desse exemplos, serem práticos e bem simples para que todos possam entender e aplicar.

    Legal a idéia de usar na Unity, e é bem por ai mesmo, gostei do script.

    Abraços.

  • Cristiano Toneis  - solicitação e parabéns!
    avatar

    Olá Kleber , sou professor e pesquisador em matemática aplicada aos jogos, e estou organizando meu material para compor um livro para desenvolvedores de jogos digitais e gostaria de poder citar e a mostrar seus exemplos. Tudo será apresentado com a maior idoneidade, especialmente os códigos que você criou, eu acrescentarei com anexos com a devida referencia feita a você!
    Posso utilizar e citar seu blog?
    fico no aguardo
    Cristiano Tonéis

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  

Busca

Linguagens

Twitter