2012-04-10 8 views
1

私は良い練習について質問があります。私はシンプルなゲームを作っています。私はいくつかのスプライトをいじっています。1包括的なタイマー対複数の、オブジェクトあたりのタイマー

私はスプライトクラスを持っています。そのクラスには、数ミリ秒ごとに実行されるタイマーがあります。

今、私はList<Creatures>を持っていて、 "Creatures"の皆さんはアニメーションを実行するためにSpriteオブジェクトを持っています。つまり、すべてのクリーチャーは、同じことをするタイマーを持っています。

私はこれを変更して、リスト上で反復するタイマーを1つ作成し、各「Creature」のアニメーションを作成する関数を呼び出しました。

いい方法はありますか?

  1. すべての「クリーチャー」に自分のタイマーを与えます。
  2. Formで1つの「ビッグ」タイマーを作成してリストを反復し、各オブジェクトからアニメーションを作成している関数を呼び出します。
  3. 異なる方法

答えて

5

私はスプライトクラスを持っています。そのクラスには、数ミリ秒ごとに実行されるタイマーがあります。

残念ながら、実際にはありません。あなたは〜ミリ秒の近傍にある(高性能ではない)システムクロックの解像度によって制限されます。あなたが好きならば1の間隔を設定することができますが、それは実際には得られないことです。

トピックに戻ると、ゲームではすべてが同じ時計で実行されます。各ティックごとに、ゲームの論理的な状態(位置とその他のもの)と表示(アニメーションフレーム、blitと画面など)を更新するループがあります。オブジェクトを並行して更新しているときにオブジェクトの状態を調整するのが非常に困難になるため、異なるタイマーを使用すると問題に遭遇する可能性があります。

更新レートを標準化して、フレームをレンダリングするのにかかる時間によっては、更新が速すぎたり遅すぎたりしないようにする必要があります。最後の更新と新しい更新の間のデルタをチェックし、それに応じて動作する必要があります。

5

それらはすべて同じ間隔で実行する場合は、一つの大きなタイマーは間違いなく行く方法です。

異なる間隔で実行しても、1つの大きなタイマー(どのサブハンドラが起動するかを決定するロジックあり)は、しばしば最も優れています。

一部のライブラリはこのロジックを内部的に追加し、OSから1つのタイマーしか要求しません。どのタイマー(.NETには少なくとも4つのタイマーがあるか)は正確には述べていないので、集中タイマーを自分で使用することをお勧めします。

+0

im using System.Windows.Forms.Timer – samy

+0

@samy:このタイマーがUIスレッドでTickイベントデリゲートを実行することを認識します。 –

1

最後のループの反復からどれくらいの時間が経過したかを把握しているゲームループを実装し、その経過時間を自分自身を更新する必要があるすべてのエンティティに渡すことをお勧めします。

たとえば、OpenTkは、ゲームループ(例:OnUpdateFrame、OnRenderFrame)を通過するたびに発生するseveral eventsを実装します。これらの各イベントは時間の単一のプロパティを持っているタイプFrameEventArgsの引数渡され

:経過時間に基づいて

/// <summary> 
/// Gets a <see cref="System.Double"/> that indicates how many seconds of time elapsed since the previous event. 
/// </summary> 
public double Time 
{ 
    get { return elapsed; } 
    internal set 
    { 
     if (value <= 0) 
      throw new ArgumentOutOfRangeException(); 
     elapsed = value; 
    } 
} 

を、あなたは、アニメーションフレームがスプライトにレンダリングするかを把握することができます。

この時間が経過すると、現在実行中の1秒あたりのフレーム数を把握し、それに基づいて意思決定を行うことができます(フレームのレンダリングをスキップし、レンダリングの複雑さを軽減します) 。

関連する問題