Ich habe derzeit etwas wie:
float deltaX = point0.getX() - point1.getX();
float deltaY = point0.getY() - point1.getY();
Und alle 0,01 Sekunden aktualisiere ich meine Objektposition wie folgt:
object.setPosition(object.getX()-deltaX/100,object.getY()-deltaY/100);
Das verschiebt mein Objekt in 1 Sekunde von Punkt 0 nach Punkt 1. Was ich brauche ist, die 2 Punkte zu haben, um das Objekt von Punkt 0 in Richtung Punkt 1 mit konstanter Geschwindigkeit bewegen zu können. Wenn ich also einen Punkt näher an meinem Anfangspunkt habe, bewegt sich das Objekt mit der gleichen Geschwindigkeit darauf zu, wie wenn ich einen weiteren Punkt hätte. Anregungen sind willkommen. Vielen Dank.
game-mechanics
movement
Fofole
quelle
quelle
Antworten:
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
undend
markieren die Endpunkte der Bewegung, geben an,speed
um wie viele Pixel sie sichelapsed
pro Sekunde bewegen soll, und wie schnell Sie die Position Ihres Objekts aktualisieren (einige Engines stellen diesen Wert bereits für Sie bereit) ):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:Dann auf dem Update - Methode, bewegen Sie das Objekt durch Hinzufügen einer Multiplikation
direction
,speed
undelapsed
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:Schnelle Referenz für Vektoroperationen
Darstellung
Summe / Subtrahieren
Mit Skalar multiplizieren (float)
Länge / Distanz
Normalisieren
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
quelle
Vector2 start;
wirdfloat startX, startY;
. Und Sie können den Abstand leicht manuell berechnen, wie ich am Ende erkläre. D. hfloat dX = bX - aX; float dY = bY - aY; float distance = Math.sqrt(dx*dx+dy*dy);
.Erstellen Sie einen Vektor und normalisieren Sie ihn. Achtung, ein Pseudocode mit falschen Zahlen voraus:
Dies gibt Ihnen einen Vektor wie:
Nun normalisiere den Vektor und du erhältst folgendes :
Von hier aus ist es die gleiche Bewegung wie mit Ihrem Delta.
quelle
Kopiert und eingefügt von meiner Antwort an: Punkte auf einer Linie zwischen zwei Punkten erhalten
Im Pseudocode:
quelle