如何在同一类的实例之间共享派生字段?

我正在用C#(XNA)开发一款游戏,但我无法弄清楚如何做到这一点。 以下是我正在进行的一个非常简化的版本:

class GameObject
{
    Protected Sprite mSprite;
    Protected string filename;

    public LoadContent(ContentManager theContentManager)//XNA forces you to load content through a Content Manager which belongs to the main game class
    {
    mSprite.Load(theContentManager, filename);//the Sprite class contains a texture and methods to deal with loading images, animating, etc
    }
}

class SomeObject : GameObject
{
    public SomeObject()
    {
    filename = "someobject.png";
    }
}

'SomeObject'的每个实例都有相同的Sprite,它在启动'SomeObject'后由继承的loadContent方法加载。 一般来说,LoadContent方法在游戏开始时只调用一次。

但是,我希望能够在游戏正在运行后添加新对象。 如果我可以让'SomeObject'的每个实例共享相同的精灵,那么这将会很好,因此新实例不必再次加载相同的图像。 目前,我只是从现有的对象复制精灵,例如someObject2.mSprite = someObject1.mSprite但是,这只适用于该类的现有实例从中复制。 我想要做的是让mSprite是静态的,但是如果我在基类中声明它是静态的,所有其他对象将得到相同的精灵,并且如果我在派生类中声明它,我无法弄清楚无需将加载方法重新写入每个类中即可加载图像。 有没有办法做到这一点?


您可以在基类中创建protected abstract属性。

每个派生类可以将一个精灵存储在一个静态字段中,并从覆盖的属性中返回它。


会有这样的套件你的需求? 我创建了一个所有游戏对象都可以使用的精灵集合,如果你指定了一个与已创建的精灵同名的精灵,它将使用对加载精灵的引用,如果这是新精灵加载的新名称。

public class GameObject
{
    protected static Dictionary<string, Sprite> sprites = new Dictionary<string, Sprite>();

    protected string fileName;
    protected Sprite sprite;

    public void LoadContent(ContentManager contentManager)
    {
        lock (sprites)
        {
            if (sprites.ContainsKey(fileName))
                sprite = sprites[fileName];
            else
                sprites.Add(fileName, mSprite.Load(theContentManager, filename));
        }
    }

    public GameObject(string fileName)
    {
        this.fileName = fileName;
    }
}
链接地址: http://www.djcxy.com/p/95517.html

上一篇: How to share derived fields between instances of the same class?

下一篇: XNA: serializing object to isolated storage