Usaré algunas estructuras de álgebra lineal, ya que es más fácil describir las operaciones de esa manera. En caso de que no sepa cómo implementar estas operaciones vectoriales, le daré una explicación rápida al final.
Entonces, digamos que comienza con estos valores: start
y end
marca los puntos finales del movimiento, speed
es cuántos píxeles debe mover por segundo y elapsed
es la velocidad a la que actualizará la posición de su objeto (algunos motores ya le proporcionan ese valor ):
Vector2 start = new Vector2(x1, y2);
Vector2 end = new Vector2(x2, y2);
float speed = 100;
float elapsed = 0.01f;
Lo primero que querrá calcular es la distancia entre ambos puntos y un vector normalizado que contiene la dirección de principio a fin. Además, debe "ajustar" la posición del objeto al start
punto. Este paso se realiza solo una vez, al principio:
float distance = Vector2.Distance(start, end);
Vector2 direction = Vector2.Normalize(end - start);
object.Position = start;
moving = true;
Luego de su método de actualización se pasa el objeto mediante la adición de una multiplicación de direction
, speed
y elapsed
en su posición. Después de eso, para verificar si el movimiento ha terminado, puede ver si la distancia entre el punto inicial y la posición actual del objeto es mayor que la distancia inicial que calculó. Si eso es cierto, ajustamos la posición del objeto al punto final y dejamos de moverlo:
if(moving == true)
{
object.Position += direction * speed * elapsed;
if(Vector2.Distance(start, object.Position) >= distance)
{
object.Position = end;
moving = false;
}
}
Referencia rápida de operaciones vectoriales
Representación
Vector2 A = float aX, aY;
Suma / Resta
A+B = a.x + b.x; a.y + b.y;
A-B = a.x - b.x; a.y - b.y;
Multiplicar por escalar (flotante)
A*float = a.x*float; a.y*float;
Longitud / distancia
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);
Eso debería ser suficiente para convertir el código anterior en operaciones regulares si no tiene una Vector
clase disponible para usted.
Ejemplo de conversión
// 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;
}
}