Ich werde einige lineare Algebra-Strukturen verwenden, da es einfacher ist, die Operationen auf diese Weise zu beschreiben. Falls Sie nicht wissen, wie Sie diese Vektoroperationen implementieren sollen, werde ich am Ende eine kurze Erklärung geben.
Angenommen, Sie beginnen mit diesen Werten: start
und end
markieren die Endpunkte der Bewegung, geben an, speed
um wie viele Pixel sie sich elapsed
pro Sekunde bewegen soll, und wie schnell Sie die Position Ihres Objekts aktualisieren (einige Engines stellen diesen Wert bereits für Sie bereit) ):
Vector2 start = new Vector2(x1, y2);
Vector2 end = new Vector2(x2, y2);
float speed = 100;
float elapsed = 0.01f;
Das erste, was Sie berechnen möchten, ist der Abstand zwischen beiden Punkten und ein normalisierter Vektor, der die Richtung vom Anfang bis zum Ende enthält. Außerdem sollten Sie die Objektposition auf den start
Punkt "einrasten" . Dieser Schritt wird zu Beginn nur einmal ausgeführt:
float distance = Vector2.Distance(start, end);
Vector2 direction = Vector2.Normalize(end - start);
object.Position = start;
moving = true;
Dann auf dem Update - Methode, bewegen Sie das Objekt durch Hinzufügen einer Multiplikation direction
, speed
und elapsed
zu seiner Position. Anschließend können Sie überprüfen, ob die Bewegung beendet ist und ob der Abstand zwischen dem Startpunkt und der aktuellen Position des Objekts größer ist als der ursprünglich berechnete Abstand. Wenn dies zutrifft, fangen wir die Position des Objekts am Endpunkt und stoppen das Verschieben des Objekts:
if(moving == true)
{
object.Position += direction * speed * elapsed;
if(Vector2.Distance(start, object.Position) >= distance)
{
object.Position = end;
moving = false;
}
}
Schnelle Referenz für Vektoroperationen
Darstellung
Vector2 A = float aX, aY;
Summe / Subtrahieren
A+B = a.x + b.x; a.y + b.y;
A-B = a.x - b.x; a.y - b.y;
Mit Skalar multiplizieren (float)
A*float = a.x*float; a.y*float;
Länge / Distanz
length(A) = sqrt(a.x*a.x + a.y*a.y)
distance(A,B) = length(B-A)
Normalisieren
normalize(A) = a.X/length(A); a.Y/length(A);
Das sollte ausreichen, um den obigen Code in reguläre Operationen umzuwandeln, wenn Ihnen keine Vector
Klasse zur Verfügung steht.
Beispiel für die Konvertierung
// 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;
}
}