Userò alcune strutture di algebra lineare poiché è più facile descrivere le operazioni in quel modo. Se non sai come implementare queste operazioni vettoriali, alla fine ti darò una rapida spiegazione.
Quindi supponiamo che inizi con questi valori: start
e end
segna i punti finali del movimento, speed
quanti pixel dovrebbe spostare al secondo, ed elapsed
è la velocità con cui aggiornerai la posizione del tuo oggetto (alcuni motori forniscono già quel valore per te ):
Vector2 start = new Vector2(x1, y2);
Vector2 end = new Vector2(x2, y2);
float speed = 100;
float elapsed = 0.01f;
La prima cosa che vorrai calcolare è la distanza tra entrambi i punti e un vettore normalizzato contenente la direzione dall'inizio alla fine. Inoltre, è necessario "agganciare" la posizione dell'oggetto al start
punto. Questo passaggio viene eseguito una sola volta, all'inizio:
float distance = Vector2.Distance(start, end);
Vector2 direction = Vector2.Normalize(end - start);
object.Position = start;
moving = true;
Poi sul vostro metodo di aggiornamento, si sposta l'oggetto con l'aggiunta di una moltiplicazione di direction
, speed
e elapsed
per la sua posizione. Successivamente, per verificare se il movimento è terminato, vedi se la distanza tra il punto iniziale e la posizione corrente dell'oggetto è maggiore della distanza iniziale calcolata. Se questo è vero, agganciamo la posizione dell'oggetto al punto finale e smettiamo di spostare l'oggetto:
if(moving == true)
{
object.Position += direction * speed * elapsed;
if(Vector2.Distance(start, object.Position) >= distance)
{
object.Position = end;
moving = false;
}
}
Riferimento rapido alle operazioni vettoriali
Rappresentazione
Vector2 A = float aX, aY;
Somma / Sottrai
A+B = a.x + b.x; a.y + b.y;
A-B = a.x - b.x; a.y - b.y;
Moltiplica per scalare (float)
A*float = a.x*float; a.y*float;
Lunghezza / Distanza
length(A) = sqrt(a.x*a.x + a.y*a.y)
distance(A,B) = length(B-A)
Normalizzare
normalize(A) = a.X/length(A); a.Y/length(A);
Questo dovrebbe essere sufficiente per convertire il codice sopra in normali operazioni se non hai una Vector
classe a tua disposizione.
Esempio di conversione
// 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;
}
}