尽我所能尽力为自己的帖子命名,但这里也是。
我有5个类用于动画可以完成的各种“效果”动画(alpha变化,颜色变化,位置变化,旋转变化,比例变化)。除变量类型外,它们都是相同的。它们都使用抽象类来表示可以在它们之间共享的方法,以及在派生类中重写的方法。
我有一个类用于处理名为AnimationHandler的游戏对象的所有动画。它的作用是为我的游戏对象存储所有效果动画(以及精灵动画)并处理它们。
我想要做的是将所有效果存储到一个字典中,然后用于处理该对象动画的所有更改。我想知道是否可以这样做,或者是否更容易有5个单独的词典来分别处理每个效果?
我想弄清楚的问题是如何访问不在抽象类中的变量。
以下是我的基类和派生类的示例代码:
abstract class EffectAnimation
{
protected EffectInfo Info;
public EffectInfo info
{
get
{ return Info; }
}
protected EffectType TypeOfEffect;
public EffectType typeofeffect
{
get
{ return TypeOfEffect; }
}
public abstract void NewAnimation();
public void Update(double time)
{
AnimationDone(time);
if (!info.Done)
{
if (UtilityAnimation.ReadyForNextFrame(time, Info.FrameLength))
{
Info.NextFrameTime = time + Info.FrameLength;
ChangeValue();
}
}
}
public void Start(double time)
{
Info.StartTime = time;
Info.NextFrameTime = time + Info.FrameLength;
}
public abstract void ChangeValue();
public abstract void Clamp();
protected abstract void AnimationDone(double time);
}
class AlphaAnimation : EffectAnimation
{
private float Change;
public float change
{
get
{ return Change; }
set
{ Change = value; }
}
private float End;
public float end
{
get
{ return End; }
set
{ End = value; }
}
private float Total;
public float total
{
get
{ return Total; }
set
{ Total = value; }
}
public void NewAnimation(EffectInfo stuff, float starting, float ending, float partialtotal)
{
Total = starting + partialtotal;
Info = stuff;
End = ending;
Info.Initialize();
Change = UtilityAnimation.MakeFadeAmount(stuff.AnimationLength, starting, ending, stuff.FPS);
}
public void ChangeValue()
{ Total += Change; }
private void Clamp()
{
if (Change > 0) // animation is positive
{
if (Total > End)
{
Total = End;
}
}
else // animation is negative
{
if (Total < End)
{
Total = End;
}
}
}
private void AnimationDone(double time)
{
Clamp();
if ((Total == End) && (time >= Info.DoneTime()))
{ Info.Done = true; }
}
}
答案 0 :(得分:1)
如果没有反映或检查实际类型,您所要求的内容(通过类型change
的引用访问AlphaAnimation
EffectAnimation
)是不可能的。话虽如此,如果可能的话,应该改变设计,以便在不知道其类型的情况下触发动画的期望效果。根据具体情况,这可能很困难;在某些情况下,它可能完全没有意义。
答案 1 :(得分:0)
这是一种可能的解决方案;
List<EffectAnimation> animations = new List<EffectAnimation>();
animations.Add(new AlphaAnimation());
EffectAnimation item = animations[0];
if(item is AlphaAnimation)
{
AlphaAnimation alphaItem = item as AlphaAnimation;
float total = alphaItem.Total;
float change = alphaItem.Change;
}
这基本上只是将它投射到正确的类,然后您可以轻松访问所需的属性。您仍然可以将所有动画添加到同一个列表中 - 只需确保在您拿出一个动画时检查它是否正确。