を実行するクラスを一般化し、線形補間の結果に基づいて、スプライトのアルファレベルを更新し、次のコードがあります。C#クラス編成/構造は - 私はC#のXNAゲームに取り組んでいますルーピング線形補間
をclass AlphaProcess : GameProcess {
Sprite sprite;
public Sprite Sprite {
get { return sprite; }
set { sprite = value; }
}
float start;
public float Start {
get { return start; }
set { start = value;}
}
...<snip>...
public override void Update(float elapsed) {
if (FirstUpdate) {
Start = sprite.Alpha;
FirstUpdate = false;
}
Time += elapsed;
if (Time >= Duration)
Finished = true;
sprite.Alpha = MathHelper.Lerp(start,end,Time/Duration);
}
}
'Start'(float)、 'FirstUpdate'(bool)、 'Time'(float)、 'Duration'(float)はAlphaProcessクラスのすべてのフィールドです。 'Sprite'は、スケール、位置、方向、回転などの詳細を含むクラスです。
'Update'メソッドは、指定された期間に渡ってスプライトの新しいアルファ値を1秒間に60回呼び出されます。ゲームプロセスが終了すると、GameProcessはキューから削除されます。
このコードは正常に動作しますが、非常に具体的です。私が持っているSpriteクラスには、一定の時間(回転、位置(イージーイン/アウトのため))にわたって移動するのに便利な多くのプロパティが含まれています。これらの変数の多くはフロートです。異なる変数上で、まったく同じことをする複数の 'GameProcess'拡張クラスを作成することは馬鹿馬鹿しいようです。しかし、私はどのように最良のリファクタリングを行うかを考えることができないので、特定のスプライトでなく、変更されている浮動小数点値へのポインタを持つことができ、アルファ/回転/スケール/任意の値です。
私はC#の参照/値/パラメータを使用しているので、あなたはフィールドとして参照を保存することはできません。 Updateを呼び出す 'GameProcessQueue'は更新されている 'GameProcess'の内部構造を何も知らない。 これを行うよりスマートな方法があるので、クラスを一般化/抽象化して別のクラスのフィールドを更新することができます(ここでは 'Sprite'の 'Alpha'フィールド)。
あなたは正しいです - 「あなたがこのクラスを持たないようにしようとしていることはわかっていますが」 - これはまだ私が持っているものを構造化するもっと良い方法です。ちなみに、私は既に 'Animation'のクラスを持っています(基本的には、 'ITweenFunction'を実装しています.AlphaProcess(とSOの簡潔さではない)。 – codinghands
また、好奇心の理由から、 m_ 'プレフィックス? – codinghands
心配ありません。素晴らしい質問。m_(メンバ変数)プレフィックスはC++の遺産であり、ここではベストプラクティスではありません。 – Empyrean