2016-05-19 8 views
0

私はEntity.csFollow(Vector2 point)の任意のポイントをマップにしようとしています。これは "力"を使って行わなければなりません。地図上でEntityを移動するために使用されるEntityVector2です。 Update(float elapsedTime)Entityの場合、EntityForce * elapsedTimeで移動します。このように:だから次のポイントは力を使用して

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

、私は、Update機能と同様の機能を作成することがポイントに移動するようにEntityに十分な力を加えること、そしてそれがそのポイントに達したときに停止される、Followと呼ばれます。

これは弾丸クラス(Entityの子供)が敵に従うのに使うことができます。そのようなものであれば、私はゲームでそれをどのように使うのか全部見ることができます。現在

は、コードは次のようになります。

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

そして、この関数を呼び出すコードは、この行はすべてのUpdateに呼び出されたことを、この

Follow(followThisPoint, 300 * elapsedTime); 

ノートのように見え、そしてそれは私どのようにありますやりたい

この関数で問題になっているのは、エンティティにあまりにも多くの力が加わり、右のトラフが通過したい場所に移動してから、通過すると遅くなり、戻ってきますが、私は今説明したのと同じ結果を得ますが、反対方向です。

私は、Entityが関心のあるポイントを瞬時に停止するか、近くになると遅くなり、そのポイントをゆっくりと止めることを制御したいと考えています。

編集1:要求されたとして、ここAddForce機能は次のとおりです。私は質問に答える前に

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

質問に「AddForce」機能を追加できますか?簡単な思考から、私は後に続く強度値を減らすでしょう - (あなたの上記のケースでは、300を減らして、なぜその値を1にしないか)、それが本当に遅くなるか見てみましょう。あなたのフォロー機能で参照されるフォースの価値は何ですか? – Neil

+0

続行 - 目的地にいるときは、(-force)の代わりに(-force * elapsedtime)を使用しないでください。 – Neil

+0

確かに、(-force * elapsedtime)は正しいものですが、私もそれに気づいていないので、実際にその行のコードを見ることはできません。 '300'は強度なので、1を置くだけで同じ結果が得られますが、はるかに遅くなります。それは本当の問題ではありません。私は今質問にAddForce関数を追加します – Monset

答えて

1

、私はいくつかの用語を明確にしたいです。

変数forceは実際には速度です。オブジェクトの移動速度を表します。力は、加速によって物体の速度を変化させることができる。オブジェクトに力を加えると、このオブジェクトは加速されます。速度への影響は、どれくらいの時間、力が加えられ、物体の質量に依存します。

あなたの質問を見てみましょう。

vTarget = (follow - position) * intensity 

これは、オブジェクトがターゲットに到達したときに、速度が0になったことを意味:あなたは結果の速度ベクトルがあるように、力を適用します。ベロシティを上限に制限することもできます。

vTarget   = vCurrent + F 
vTarget - vCurrent = F 

ここでも、あなたはFの長さを制限することができます。

があなたのAddForce定義を考えると、あなたは以下の力Fを適用する必要があります。そして、これはすべてあります。以下はC#/擬似コードです:

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

聖なる牛。これは魅力のように機能します!ありがとうございました! :D – Monset