私は 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 のフィールドです。「スプライト」は、スケール、位置、方向、回転などの詳細を含むクラスです。
「Update」メソッドは 1 秒間に 60 回呼び出され、指定された期間にわたってスプライトの新しいアルファ値を計算します。完了すると、GameProcess はキューから削除されます。
このコードは問題なく動作しますが、非常に具体的です。私が持っている Sprite クラスには、一定期間 (回転、位置 (イージング インとイージング アウト)) を lerp するのに便利な多くのプロパティが含まれています。これらの変数の多くは float でもあります。異なる変数に対して、ほとんど同じことを行う複数の「GameProcess」拡張クラスを作成するのはばかげているようです。ただし、特定のスプライトではなく、変更されている浮動小数点値へのポインターを保持できるように、これを最適にリファクタリングする方法を考えることができず、それはアルファ/回転/スケール/任意の値です。
SO に関する C# 参照 / 値 / パラメータの受け渡しに関する質問を経験しましたが、C# では参照をフィールドとして格納できないことを知っています。Update を呼び出す「GameProcessQueue」は、更新中の「GameProcess」の内部について何も知りません。クラスを一般化/抽象化して別のクラスのフィールドを更新できるように、これを行うよりスマートな方法はありますか (ここのように、「スプライト」の「アルファ」フィールドを使用)?