2016-07-12 6 views
0

私が達成しようとしているのは、2D環境で別のスプライトに移動するスプライトです。私は基本的なMx = Ax - Bx契約から始めました。しかし、スプライトがターゲットに近づくほど、スピードが遅くなることに気付きました。だから、速度に基づいてパーセンテージ/比を作成しようとしましたが、各xとyは速度許容量のパーセンテージを得ましたが、それは非常に奇妙な動作をしており、MxとMyが正の場合にのみ働くようです。 コード抽出:基本的なC++エンジンで一貫した速度を使って速度を計算する

ballX = ball->GetX(); 
    ballY = ball->GetY(); 
    targX = target->GetX(); 
    targY = target->GetY(); 
    ballVx = (targX - ballX); 
    ballVy = (targY - ballY); 
    percentComp = (100/(ballVx + ballVy)); 
    ballVx = (ballVx * percentComp)/10000; 
    ballVy = (ballVy * percentComp)/10000; 

EDIT:/ 10000あなたはスプライトが一定の速度で移動すると仮定すると、あなたはこのように、XとYの位置の両方に線形フェードを行うことができますスプライトの動きに

+0

balltaの長さを特定の数値に設定することができます。 –

+0

"私は基本的な* Mx = Ax - Bx *の取引から始めましたが、スプライトのターゲットに近いほど速度が遅くなることに気付きました。あなたの入力や出力が最初に間違っていたようなサウンドあなたのミスを考慮して数式を調整しないで、デバッグする必要があります。 2番目の点にベクトルを見つけて、そのベクトルをデルタ時間でスケーリングして新しい位置を見つける必要があります。 –

答えて

1

を遅くすることです。

#include <stdio.h> 

int main(int, char **) 
{ 
    float startX = 10.0f, startY = 20.0f; 
    float endX = 35.0f, endY = -2.5f; 
    int numSteps = 20; 

    for (int i=0; i<numSteps; i++) 
    { 
     float percentDone = ((float)i)/(numSteps-1); 
     float curX = (startX*(1.0f-percentDone)) + (endX*percentDone); 
     float curY = (startY*(1.0f-percentDone)) + (endY*percentDone); 

     printf("Step %i: percentDone=%f curX=%f curY=%f\n", i, percentDone, curX, curY); 
    } 
    return 0; 
} 
0

ありがとうございます今、私は今働いていますが、パーセント値の代わりにベクトルを正規化しています。今私が持っているものは次のとおりです。

ballX = ball->GetX(); 
    ballY = ball->GetY(); 
    targX = target->GetX(); 
    targY = target->GetY(); 
    ballVx = (targX - ballX); 
    ballVy = (targY - ballY); 
    vectLength = sqrt((ballVx*ballVx) + (ballVy*ballVy)); 
    ballVx = (ballVx/vectLength)/10; 
    ballVy = (ballVy/vectLength)/10; 
+0

ボールがターゲットにあるときに0で割ることを監視する(まだチェックしていない場合) – Blindman67

関連する問題