2012-02-27 15 views
0

トゥイーンのようなアニメーションを実装する方法を考えるのは苦労しています。たとえば、deltaXだけを置くcurrentX + 3に移動し、残りは補間されます。私は今のところ持っている:ゲームオブジェクトのxとyの値を変更することにより、アニメーションOpenGLでのアニメーションの実装

public void onDrawFrame(GL10 gl) { 

    endingTime = System.currentTimeMillis(); 
    int timeElapsed = (int) (endingTime - startingTime); 

    if (timeElapsed < FRAMEDURATION_MILISEC) { 
     try { 
      Thread.sleep(FRAMEDURATION_MILISEC - timeElapsed); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
    startingTime = System.currentTimeMillis(); 
    Game.renderGame(gl); 
} 

AND論理スレッド、:描画時間を追跡し、フレームレートを扱う

描画/ OpenGLのスレッド、 :

static long RATE = 30l; // times 
static long duration = 1000l/RATE; 

public void run() { 
    lastUpdate = System.currentTimeMillis(); 

    long dur = duration; // copy 

    while (Game.running) { 

     long tElapsed = System.currentTimeMillis() - lastUpdate; 

     if (tElapsed >= dur) { 
      lastUpdate = System.currentTimeMillis(); 
      Game.updateGame(tElapsed); 
     } else { 
      try { 
       GameLogicThread.sleep(dur - tElapsed); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 

私は、私は、例えばゲームオブジェクトのためのxの違いを設定し、その位置が更新されるように、ゲームオブジェクトにこのアニメーションオブジェクトを適用し、いずれかの図面の可能性がアニメーションクラスを実装したかったですまたはロジックループを使用します。

私はこれをどこで行うべきか、まったくきれいな構造を保つ方法を知りません。誰か助けてくれますか?


EDIT:

おかげで、私は今あなたがdScaleなどをdX、dYを、dRotationを渡すことができますしている、GLAnimationクラスを作ったそれは、オブジェクトがPERを変更する必要が速度を算出し、ミリ秒。このAnimationオブジェクトの呼び出しはGameObjectに適用されるため、updateとrenderの呼び出しはtimeElapsedを渡してオブジェクトを移動できます。ありがとうzmccord!

答えて

2

物理的なスレッド(「論理スレッド」)とグラフィックススレッドが存在することは、本質的に今話しているところです。私はあなた自身に尋ねたい最初の質問は、それを別のスレッドに分割する価値があるかどうかということです。あなたの論理/物理学は実際にあなたのフレームレートに悪影響を与えるのに十分に計算的に集中していますか?シンプルなゲームでは、バグや労力を節約して1つのループにまとめることができます。コードは、機能の各カテゴリごとに別々のファイルに分解されるべきですが、どちらも同じスレッドで実行できます(ステップロジック、描画、繰り返し)。

シングルスレッドアプローチに進む理由の1つは、物理学が可能な限り高い速度で実行されているように見えることです。これは実際には良い考えではありません。小さな精度向上のために多くのパワーを消費します---ゲームコードがどのように見えるかに応じて精度が低下する可能性があります。物理学が本当に複雑で高精度が必要な場合を除いて、あなたの物理フレームレートがあなたのグラフィックスフレームレートよりも高くなっている点は全くありません。

私はあなたのアニメーションオブジェクトのアイデアが好きです。どのようにするかは、GameObjectsに含まれるものや、アニメーションオブジェクトが変更したいものに大きく依存することになります。アニメーションオブジェクトがそれを変更するために使用できるプロトコルに準拠するようにGameObjectを書くことをお勧めします。もしあなたがC++であれば、それを達成する最も簡単な方法はすべてのGameObjectsをルートGameObjectクラスから継承させることです。その後、AnimationオブジェクトにGameObjectを変更する方法に関する情報を含めることができます。

我々はC++にしている場合は、私がお勧めします:

ルートゲームオブジェクトクラスのメソッド:

  • セット/取得位置
  • セット/オリエンテーション
  • セット/他のどんな状態ゲットをゲームオブジェクトは持っている。サイズ?色?速度?

ルートアニメーションクラスは、一方(仮想)メソッドを持つ仮想ある:

  • は、例えば、個々のアニメーションを実行するアニメーションルートクラスのサブクラスそして

オブジェクトにアニメーションを適用します AnimationTranslateは、オブジェクトの位置と角度にオフセットを追加したり、AnimationScaleがサイズを変更したり、AnimationGravityがオブジェクトを画面の下部に向かって加速させる可能性があります。

同様の設計は、任意のオブジェクト指向言語で実行できます。あなたはまた、ちょっとした脚の仕事をして、まっすぐなCでそれを引き出すことができます。もしあなたがそれをしたなら、おそらく関数ポインタメンバーをあなたの構造に入れるというトリックに行きたいと思うでしょう。 sum型の言語を使用している場合、アニメーションの継承階層の代わりにsum型を使用できます。同じ考えが適用されます。

関連する問題