5

私は現在、Android 向けのゲームを開発しています。私が抱えている問題について、あなたの専門知識を教えてください。

バックグラウンド:

  1. 私のゲームにはフレーム レートに依存しないモーションが組み込まれており、必要な速度計算を実行する前にデルタ時間値が考慮されます。

  2. ゲームは伝統的な 2D プラットフォーマーです。

問題:

これが私の問題です(簡略化)。私のキャラクターがプラットフォームの上に立っている正方形であるとしましょう (「重力」は characterVelocityDown の一定の下降速度です)。

衝突検出を次のように定義しました(Y 軸が下向きであると仮定します)。

characterFootYが正方形のキャラクターのベースの y 座標、platformSurfaceYがプラットフォームの上部 y 座標、platformBaseYがプラットフォームの下部 y 座標であるとします。

  if (characterFootY + characterVelocityDown > platformSurfaceY && characterFootY + characterDy < platformBaseY) {

                    //Collision Is True
                    characterFootY = platformSurfaceY;
                    characterVelocityDown = 0;

                } else{ 
                    characterVelocityDown = deltaTime * 6;

このアプローチは、ゲームが通常の速度で実行されている場合は問題なく機能します。ただし、ゲームの速度が低下すると、deltaTime (前のフレームと現在のフレームの間の経過時間) が大きくなり、characterFootY + characterVelocityDownが衝突検出を定義する境界を超え、キャラクターはまっすぐ落下します (あたかもテレポートするかのように)。 )。

これを防ぐには、この問題にどのようにアプローチすればよいですか?

ご協力いただきありがとうございます。あなたから学ぶことを楽しみにしています。

4

2 に答える 2

1

ここでの問題は、減速が避けられないということだと思います。コードを試して最適化することはできますが、遅いデバイスを使用しているユーザーや、すべてを処理するのに通常よりも少し時間がかかるゲームのビジーなセクションが常に存在します。一貫したデルタを想定する代わりに、その逆を想定します。誰かがそろばんにインストールしようとする可能性があるという認識の下でのコード。

つまり、基本的には、Seven が言うように、ゲーム ループがスローダウンを処理するようにします。これを行う唯一の現実的な方法は (確かに限られた私の経験では)、デルタの大きさに上限を設定することです。これにより、時計が正確に時間どおりに実行されなくなりますが、考えてみると、ほとんどのゲームがスローダウンを処理する方法です. pentium 66 で StarCraft を起動せず、5 FPS で実行しますが、フル スピードで実行すると、速度が低下し、スライドショーではありますが、通常どおりに処理されます。

そのようなことをした場合、ゲームの速度が低下している期間中に、目に見えて速度が低下します... しかし、計算はすべて正確に行われるはずです。

編集: あなたが SevenN だと気付きました。素晴らしい。

于 2012-06-18T08:33:18.577 に答える
1

あなたがする必要があるのは、一定のデルタ時間で物理ループを実行し、現在のティックで必要な回数だけ反復することです。

const float PHYSICS_TICK = 1/60.f; // 60 FPS
void Update( float dt )
{
    m_dt += dt;
    while( m_dt > PHYSICS_TICK )
    {
        UpdatePhysics( PHYSICS_TICK );
        m_dt -= PHYSICS_TICK;
    }
}

ティック左 ( m_dt ) を処理するために使用されるさまざまなテクニックがあります
。最小ティックと最大ティックのキャップも必須です。

于 2012-06-18T10:23:56.977 に答える