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
















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;
}
--------------------