C#是否可以将类存储到集合中?

时间:2015-01-09 06:57:16

标签: c# collections

尽我所能尽力为自己的帖子命名,但这里也是。

我有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; }
    }
}

2 个答案:

答案 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;
}

这基本上只是将它投射到正确的类,然后您可以轻松访问所需的属性。您仍然可以将所有动画添加到同一个列表中 - 只需确保在您拿出一个动画时检查它是否正确。