2012-06-17 7 views
5

現在、Android用のゲームを開発しており、私が抱えている問題についての専門知識をお伝えしたいと思います。Androidのゲーム開発:衝突の検出に失敗する

背景:

  1. 私のゲームは が必要な速度に 計算を実行する前に、デルタ時間値を考慮したフレームレートの独立運動を、組み込まれています。

  2. ゲームは従来の2Dプラットフォームです。

問題:

ここに私の問題(簡体字)です。私のキャラクターがプラットホームの上に立っている(キャラクターは、 "重力"がcharacterVelocityDownの一定の下向きの速度である)というふりをしましょう。

次のように私は(下方にY軸点を仮定して)衝突検出を定義している:characterFootYを考える

は、platformSurfaceYは、上側のy y座標私の正方形の文字のベースであります私のプラットフォームの - 座標、及びplatformBaseYが低い私のプラットフォームのy座標である:

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

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

       } else{ 
        characterVelocityDown = deltaTime * 6; 

このアプローチは、p作品ゲームが通常のスピードで走っているときはうんざりです。ゲームが遅くなる場合は、(前のフレームと現在のフレームとの間の経過時間である)deltaTimeが大きくなり、characterFootY + characterVelocityDownだけ低下衝突検出や文字を定義する境界を超えストレートスルー(まるで瞬間移動のように)。

この問題を回避するにはどうすればよいですか?

ご協力いただきありがとうございます。私はあなたからの学習を楽しみにしています!

+0

他の誰かがこの問題を抱えている場合は、deltaTime値を上限にして特定の値を超えたときに上限に設定することができます。これはゲームのスピードを矛盾させますが、ほとんどの場合は大丈夫です。 – SeveN

+0

前と後の両方のデルタ値がありますか?そこで比較ができるのですか? – cjk

答えて

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)miniumumダニやダニの最大のための
キャップを処理するために使用される様々なテクニクスがあるにも必須です。

+0

ほとんどのゲームでは、(物理だけでなく)ゲームロジック全体のタイムステップを修正するのが最も簡単です。 –

1

ここでの問題は、減速が避けられないことです。コードを試して最適化することはできますが、通常、ゲームを処理するには通常よりも少し時間がかかりますが、ゲームの遅いデバイスやビジーなセクションを持つユーザーが常にいます。一貫したデルタを仮定するのではなく、その逆を仮定する。誰かがそろばんの上にそれをインストールしようとしていることを実感してコードする。

基本的に、SeveNは言うように、ゲームループを減速させるようにします。これを行う唯一の本当の方法は(私の間違いのない経験では)デルタの大きさに上限を付けることです。これはあなたの時計が時間通りに実行されないようにしますが、それについて考えるとき、それはほとんどのゲームが減速をどのように処理するかです。あなたはPentium 66でStarCraftを起動せず、5FPSでフルスピードで動作させますが、スライドショーでも通常の速度で処理して処理します。

あなたがこのようなことをした場合、ゲームの減速の間、目に見えるほど減速するでしょう...しかし、計算はまだすべてにスポットが必要です。

編集:あなたはSeveNだと分かりました。よくやった。

+0

[冒とくではありません](http://meta.stackexchange.com/a/22233/142838) – meagar