Usarei algumas estruturas de álgebra linear, pois é mais fácil descrever as operações dessa maneira. Caso você não saiba como implementar essas operações de vetor, darei uma explicação rápida no final.
Então, digamos que você comece com esses valores: start
e end
marque os pontos finais do movimento, speed
é quantos pixels ele deve mover por segundo e elapsed
é a taxa na qual você atualizará a posição do seu objeto (alguns mecanismos já fornecem esse valor para você ):
Vector2 start = new Vector2(x1, y2);
Vector2 end = new Vector2(x2, y2);
float speed = 100;
float elapsed = 0.01f;
A primeira coisa que você deseja calcular é a distância entre os dois pontos e um vetor normalizado que contém a direção do início ao fim. Além disso, você deve "ajustar" a posição do objeto ao start
ponto. Esta etapa é realizada apenas uma vez, no início:
float distance = Vector2.Distance(start, end);
Vector2 direction = Vector2.Normalize(end - start);
object.Position = start;
moving = true;
Em seguida, em seu método de atualização, você mover o objeto, adicionando uma multiplicação de direction
, speed
e elapsed
para a sua posição. Depois disso, para verificar se o movimento terminou, você vê se a distância entre o ponto inicial e a posição atual do objeto é maior que a distância inicial calculada. Se isso for verdade, ajustamos a posição do objeto ao ponto final e paramos de movê-lo:
if(moving == true)
{
object.Position += direction * speed * elapsed;
if(Vector2.Distance(start, object.Position) >= distance)
{
object.Position = end;
moving = false;
}
}
Referência Rápida de Operações de Vetor
Representação
Vector2 A = float aX, aY;
Soma / Subtração
A+B = a.x + b.x; a.y + b.y;
A-B = a.x - b.x; a.y - b.y;
Multiplique por escalar (flutuador)
A*float = a.x*float; a.y*float;
Comprimento / Distância
length(A) = sqrt(a.x*a.x + a.y*a.y)
distance(A,B) = length(B-A)
Normalizar
normalize(A) = a.X/length(A); a.Y/length(A);
Isso deve ser suficiente para converter o código acima em operações regulares, se você não tiver uma Vector
classe disponível.
Exemplo de conversão
// Your Variables
float startX, startY, endX, endY;
float speed = 100;
float elapsed = 0.01f;
// On starting movement
float distance = Math.sqrt(Math.pow(endX-startX,2)+Math.pow(endY-startY,2));
float directionX = (endX-startX) / distance;
float directionY = (endY-startY) / distance;
object.X = startX;
object.Y = startY;
moving = true;
// On update
if(moving == true)
{
object.X += directionX * speed * elapsed;
object.Y += directionY * speed * elapsed;
if(Math.sqrt(Math.pow(object.X-startX,2)+Math.pow(object.Y-startY,2)) >= distance)
{
object.X = endX;
object.Y = endY;
moving = false;
}
}