如何在同一类的实例之间共享派生字段
本文关键字:实例 之间 共享 字段 派生 一类 | 更新日期: 2023-09-27 18:37:10
我正在用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 是静态的,但是如果我在基类中将其声明为静态,所有其他对象都将获得相同的精灵,如果我在派生类中声明它,我无法弄清楚如何在不将 load 方法重写到每个类的情况下加载图像。有什么办法可以做到这一点吗?
可以在基类中创建 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;
}
}