2016-10-02 3 views
-2

Ich versuche, ein Objekt in einer geraden Linie von einem Punkt zu einem anderen zu bewegen. Ich habe vor einiger Zeit etwas Ähnliches versucht, aber es bewegte sich, bis es mit der Achse ausgerichtet war. Dieser Code sah wie folgt aus:Verschieben eines Objekts von einem Punkt zum anderen

if(x < otherObject.x) x++; 
else if(x > otherObject.x) x--; 

if(y < otherObject.y) y++; 
else if(y > otherObject.y) y--; 

Dies ist ein sehr ineffizientes System, und ich habe auf anderen Wegen gesucht, um dies zu realisieren.

Aber ich muss auch mit einer bestimmten Geschwindigkeit bewegen, was ich zu kämpfen hatte. Beispiel für Koordinaten Bewegung:

-50,200 => 50,-100 
300, 300 => 600,230 

Das Ziel ist es, in einer geraden Linie von Punkt A nach B zu bewegen, zu bekommen, aber es sollte in einer gleichmäßigen Geschwindigkeit zu bewegen. In Anbetracht dieser:

Example

Das Ziel ist es, um durch die Leitung zu bewegen und die Geschwindigkeit sollte es auf der Strecke machen bleiben (etwas Ungenauigkeit ist akzeptabel, aber es auf den X/Y-Achse ausgerichtet (TargetX/targetY gleich CurrentX/CurrentY Bedeutung sollte nicht passieren).

Irgendwelche Ideen?

+1

Können Sie uns über die Logik hinter den Bewegungen nachdenken? –

+0

Die beabsichtigte Bewegung? – Zoe

Antwort

3

Zunächst einmal müssen Sie das Konzept der Bewegung von einer gegebenen „Quelle“ Punkt zu einem bestimmten „Ziel vergessen "Punkt.

Denken Sie stattdessen an Ihr Objekt zu einem bestimmten Zeitpunkt als an einem aktuellen Punkt, und in einer bestimmten Richtung mit einer bestimmten Geschwindigkeit.

Sie benötigen eine reelle Zahl, um den Winkel (im Bogenmaß) zu halten, der die Richtung angibt, in die sich Ihr Objekt bewegt. Wenn Ihr Objekt aus Quellenposition gehen muss (sx, sy) zur Zielposition (tx, ty), dann wird der Winkel wie folgt berechnet:

float deltaX = tx - sx; 
float deltaY = ty - sy; 
float angle = Math.atan2(deltaY, deltaX); 

Sie werden auch eine reelle Zahl brauchen die Geschwindigkeit zu halten, bei der dein Objekt reist. Idealerweise sollte Ihre Geschwindigkeit in Bildschirmeinheiten (Pixel?) Pro Sekunde ausgedrückt werden, aber lassen Sie uns die Dinge einfach halten und lassen Sie die Geschwindigkeit in Einheiten von Bildschirmeinheiten pro Frame ausgedrückt werden. "Frame" bedeutet einfach "wann immer man mit Rechnen und Rendering fertig wird". Sie können dies so schnell wie möglich tun, oder Sie tun es 30 Mal pro Sekunde, die Wahl liegt bei Ihnen.

Also, alle oben genannten Parameter gegeben, das Objekt der neuen Position in jedem Rahmen zu berechnen, verwenden Sie die folgenden Schritte aus:

currentX += speed * Math.cos(angle); 
currentY += speed * Math.sin(angle); 

Um herauszufinden, ob das Objekt das „Ziel“ Punkt erreicht hat, berechnen die Distanz zwischen Ihrem Objekt und dem Zielpunkt, und wenn es klein genug ist, betrachten Sie es als "dort". Erwarte nicht, dass der aktuelle Punkt deines Objekts jemals dem Zielpunkt gleich wird, was zu viel Präzision erfordern würde.

+1

Obwohl die Bewegung nicht perfekt ist, war sie auch nie beabsichtigt. Aber es bewegt sich wie beabsichtigt und das ist alles was ich brauche. Manchmal kommt es ein bisschen kurz aber es ist immer noch eine gute Methode. – Zoe

+0

es kommt ein bisschen zu kurz, wenn Sie meinen Ratschlag befolgt haben und es "dort" betrachten, wenn es eine kleine Entfernung von dort ist. Was passiert, ist, dass es bei einem Frame fast dort ankommt und beim nächsten Frame überschießt.Eine noch bessere Methode zum Bestimmen, ob Sie an Ihrem Ziel angekommen sind, besteht darin, die aktuelle Position und die vorherige aktuelle Position zu nehmen und zu sehen, ob der Zielpunkt nahe der Linie zwischen diesen beiden Positionen ist. –

+0

Ich habe ein benutzerdefiniertes Koordinatensystem, so dass ich auch überprüfen kann, ob es die Koordinaten des Zielrasters erreicht hat. Sehr grob, aber es ist eine Verbesserung, nur die Koordinaten zu überprüfen. Wenn es also überschwingt, aber in den Gitterkoordinaten ist, ist es in Ordnung. – Zoe

Verwandte Themen