我正在开发一个 C# XNA 游戏,并且有以下代码根据线性插值的结果更新 Sprite 的 alpha 级别:
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' 方法每秒调用 60 次,计算指定时间段内精灵的新 alpha 值。完成后,GameProcess 将从队列中移除。
这段代码工作正常,但它非常具体。我拥有的 Sprite 类包含许多属性,可以在固定的时间段内轻松处理(旋转、位置(用于缓入和缓出))。其中许多变量也是浮点数。创建多个“GameProcess”扩展类做几乎相同的事情似乎很愚蠢,只是在不同的变量上。但是,我想不出如何最好地重构它,这样我就可以有一个指向被修改的浮点值的指针,而不是特定的精灵,它是 alpha/rotation/scale/任何值。
我已经完成了关于 SO 的 C# 引用/值/参数传递问题,并且知道在 C# 中您不能将引用存储为字段。调用 Update 的“GameProcessQueue”对正在更新的“GameProcess”的内部结构一无所知。有没有更聪明的方法来做这件事,所以我可以概括/抽象类来更新另一个类的字段(就像这里,'Sprite'的'Alpha'字段)?