GameTime
すべてのメソッドのパラメーターで毎回その名前を明示的に入力せずに使用できるようにしたいと思います。コードではあまり見栄えがよくありません。どうやってやるの?
4 に答える
パラメーターを渡すことは OOP の基本ですが、1 つの提案は、GameTime で初期化された基本クラスを持ち、そこからすべてのクラスを拡張することです。そうすれば、保護されたメンバーとしてアクセスできます。
public class BaseClass
{
protected BaseClass(GameTime gt)
{
Time = gt;
}
protected GameTime Time {private set; protected get;}
}
public class SomeOtherClass : BaseClass
{
public SomeOtherClass(GameTime gt) : base(gt)
{
}
public void DoSomething()
{
//can access Time here
}
}
あなたは何か他のものを渡すことができます。個人的に私は通常これを行います:
float seconds = (float)gameTime.ElapsedGameTime.TotalSeconds;
something.Update(seconds);
otherThing.Update(seconds);
これにより、使用するたびに経過時間を秒単位で抽出する必要がなくなります。
タイピングの手間を少し省きたい場合は、次のようにします。
interface IHasUpdate { void Update(float seconds); }
IHasUpdate
次に、 1 回か 2 回クリックするか、ショートカット キーを使用して、クラスにインターフェイスを実装すると、Visual Studio で .NET 用の目的のスタブを作成できますUpdate
。これには、 であるオブジェクトについて推論できるという追加の利点がありますIHasUpdate
。
多くの「もの」を渡す必要がある場合は、次のような構造体を作成できます。
struct UpdateContext { float seconds; PlayerInput input; SomethingElse blah; }
これには、メソッドに新しい引数が必要な場合に、「更新コンテキスト」に新しいものを簡単に追加できるという利点がありますUpdate
。
そしてもちろん、通常は描画時に時間を実際に知る必要はないので、Draw
メソッドへの引き渡しを完全にスキップできます。
概念的に、メソッド呼び出しの特定の「ツリー」に固有のデータを持っている場合、引数を渡す以外のことをするのは本当に良い考えではありません。
すべての Game.Update() の開始時に更新されるパブリック静的プロパティ GameTime を持つグローバル静的クラス。すべてのオブジェクトは、このプロパティを介して変数にアクセスします。ただし、これは悪い習慣と見なされます。
メインの Update メソッドの実行中に変更されないことがわかったGameTime
ので、次のようにローカルの GameTime 変数でそのコピーを安全に使用できます。
public class Game1 : Microsoft.Xna.Framework.Game
{
public GameTime gt;
/* ... */
protected override void Update(GameTime gameTime)
{
gt = gameTime;
// the rest of the Update method
}
}