2016-05-19 17 views
0

Ich versuche, meine Entity.csFollow(Vector2 point) einen beliebigen Punkt in der Karte zu machen. Dies muss mit "force" erfolgen. Force ist eine Vector2 von Entity, die verwendet wird, um die Entity über die Karte zu verschieben. Auf jedem Update(float elapsedTime) von Entity wird Entity von Force * elapsedTime bewegt. Wie folgt aus:Folgenden Punkt mit Kraft

public virtual void Update (float elapsedTime) 
{ 
    position += force * elapsedTime; 
} 

Also, ich möchte eine Funktion erstellen ähnlich wie Update Funktion, genannt Follow, die genug Kraft auf die Entity hinzufügen werden, so dass es auf den Punkt bewegt, und stoppt, wenn sie diesen Punkt erreicht .

Dies könnte von bullet Klasse (Kind von Entity) verwendet werden, um einem Feind zu folgen, oder so etwas, ich glaube, Sie können alle sehen, wofür ich das im Spiel verwenden würde.

Derzeit sieht der Code wie folgt aus:

public virtual void Follow (Vector2 follow, float intensity) 
{ 
    if (position != follow) AddForce((follow - position) * intensity); 
    else AddForce(-force); 
} 

Und der Code diese Funktion wie diese

Follow(followThisPoint, 300 * elapsedTime); 

Hinweis sieht fordern, dass diese Zeile auf jeder Update genannt wird, und das ist, wie ich würde gerne sein.

Das Problem, das ich mit dieser Funktion habe, ist, dass der Entity zu viel Kraft hinzugefügt wird, und es geht gerade durch den Punkt, wo ich es haben will, und dann, wenn es passiert, verlangsamt es sich, und versucht zurückzugehen, aber dann bekomme ich das gleiche Ergebnis, das ich gerade beschrieben habe, aber in umgekehrter Richtung.

Ich möchte die Kontrolle darüber haben, wie schnell die Entity dem Punkt von Interesse folgen wird, und es sofort an der Stelle von Interesse stoppen, oder verlangsamen, wenn nah, und an diesem Punkt langsam anhalten.

Edit 1: Wie gewünscht, hier ist die AddForce Funktion:

public void AddForce (Vector2 addForce) 
{ 
    force += addForce; 
} 
+0

Können Sie die AddForce-Funktion zu Ihrer Frage hinzufügen. Von einem kurzen Gedanken, würde ich den Intensitätswert reduzieren, dem ich folge - (in Ihrem obigen Fall - reduzieren Sie die 300, warum nicht diesen Wert 1) und sehen, ob es wirklich langsamer wird. UND was ist der Wert von force (in Ihrer Follow-Funktion referenziert)? – Neil

+0

Fortsetzung - Wenn Sie sich am Zielpunkt befinden, würden Sie (-force * elimitedtime) nicht nur (-force) verwenden? – Neil

+0

ja, (-force * elimitedtime) ist die richtige, aber ich bin nie dazu gekommen, also konnte ich diese Codezeile nie in Aktion sehen. Die '300' ist die Intensität, also, wenn ich nur 1 setze, bekomme ich das gleiche Ergebnis, aber viel, viel langsamer. Das ist also nicht das eigentliche Problem. Ich werde jetzt AddForce-Funktion hinzufügen, um die Frage – Monset

Antwort

1

Bevor ich die Frage zu beantworten, möchte ich einige Begriffe klären.

Ihre Variable force ist eigentlich eine Geschwindigkeit. Es stellt dar, wie schnell ein Objekt fährt. Eine Kraft kann die Geschwindigkeit eines Objekts durch Beschleunigung verändern. Wenn Sie eine Kraft auf ein Objekt anwenden, wird dieses Objekt beschleunigt. Die Auswirkung auf die Geschwindigkeit hängt davon ab, wie lange die Kraft angewendet wird und von der Masse des Objekts.

Vor diesem Hintergrund, werfen wir einen Blick auf Ihre Frage. Sie wollen eine Kraft aufzubringen, so dass die resultierende Geschwindigkeitsvektor ist:

vTarget = (follow - position) * intensity 

Dies bedeutet, dass die Geschwindigkeit auf Null abfällt, wenn das Objekt das Ziel erreicht. Sie können die Geschwindigkeit auch auf eine obere Grenze begrenzen.

Angesichts Ihrer AddForce Definition haben Sie die folgende Kraft F anzuwenden:

vTarget   = vCurrent + F 
vTarget - vCurrent = F 

Auch hier können Sie die Länge der F begrenzen. Und das ist alles, was es gibt.Hier ist ein C#/Pseudo-Code:

public virtual void Follow (Vector2 follow, float intensity) 
{ 
    float vMax = 1000; 
    float fMax = 1000; 
    Vector2 vTarget = (follow - position) * intensity; 
    if (vTarget.Length() > vMax) vTarget = vTarget * (vMax/vTarget.Length()); 
    Vector2 force = vTarget - this.force; //where this.force is actually the velocity 
    if (force.Length() > fMax) force = force * (fMax/force.Length()); 
    AddForce(force); 
} 
+0

Heilige Kuh. Das funktioniert wie ein Zauber! Vielen Dank! : D – Monset