-1

次のシナリオの正しい減速率を見つけるのを手伝っていただけませんか。車が停車しなければならないポイントAがあります。車がAから200ピクセル離れており、速度が50で移動しているとします。次に、車が速度を徐々に下げて最終的にA点で停止するように、正しい減速を実現するにはどうすればよいですか。現実の世界では非常に簡単ですが、コンピューターの世界では、車が動かないという事実を考慮に入れる必要があります。実際には、新しい位置で毎回画面を再描画するだけです。言うまでもなく、指定された速度で車を前進させるメソッドを起動するスケジュールがあります。ですから、計算の際にはスケジュール間隔も考慮に入れる必要があると思います。言語、デバイス、プラットフォームは重要ではないと思いますが、念のために

4

1 に答える 1

1

心配しないでください。ここでは特別な種類の数学は必要ありません。「実世界の数学」を問題なく使用できます。スケジューラとフレームレートの問題も実際の問題ではありませんが、フレームレートに依存する動きに関連しています。オブジェクトを移動するためのこの関数があると仮定します(半分の擬似コード):

- (void)move
{
    if(velocity.x < 5)
        return;

    car.x += velocity.x;
    velocity.x -= 5;
}

このコードはフレームレートに依存します。たとえば、30 FPSでレンダリングしvelocity.x、150で開始する場合、オブジェクトが0に減速するのにちょうど1秒かかります。ただし、FPSが60で同じメソッドを実行する場合、オブジェクトが0に減速するのにかかる時間はわずか0.5秒です。

したがって、本当に必要なのは、フレームレートに関係なく車を移動する方法です。これにより、コードを実行するフレームレートに関係なく、1秒でnポイント移動します。そして、これを達成する方法は、フレームがレンダリングに使用する時間を使用し、このデルタ時間をあなたの動きで乗算することです。また、レンダリング前またはレンダリング中にフレームのレンダリングにかかる​​時間を予測できないため、通常は前のフレームのデルタ時間を使用します。そして、次のようなコードになります。

- (void)move
{
    if(velocity.x < 5 * delta)
        return;

    car.x += velocity.x * delta;
    velocity.x -= 5 * delta;
}

(実際にこれを使用すると、以前はフレームごとに5ポイント移動していましたが、現在は1秒あたり5ポイントで移動しているため、移動が突然非常に遅くなっていることがわかります!)

私はCocos2Dプロではありませんが、(グーグルですばやく検索すると)いくつかのメソッドでデルタタイムを取得しているようです(名前を付けることはできません。クラス参照では言及されていないようですが、あなたがどこかccTimeにフレームごとに渡されるメソッドを持っているなら、それはおそらくそれらの1つです)

于 2012-06-23T20:18:57.267 に答える