【问题标题】:How to share derived fields between instances of the same class?如何在同一类的实例之间共享派生字段?
【发布时间】:2012-06-15 18:24:36
【问题描述】:

我正在使用 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 是静态的,但是如果我在基类中将它声明为静态,所有其他对象将获得相同的精灵,如果我在派生类中声明它,我无法弄清楚如何加载图像而不将加载方法重新写入每个类。 有没有办法做到这一点?

【问题讨论】:

    标签: c# xna sprite


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,这正是我想要的!我认为有类似的东西,但我不记得抽象关键字,谷歌没有帮助我。
    • 实际上,我不确定这是否可行,因为图像是如何在 XNA 中加载的。我想我的班级结构可能过于简化了,我将对其进行编辑。
    【解决方案2】:

    像这样的东西会满足您的需求吗?我创建了一个所有游戏对象都可以使用的精灵集合,如果你指定一个与已经创建的精灵同名的精灵,它将使用对加载精灵的引用,如果它是一个新名称,则新精灵被加载。

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

    【讨论】:

      猜你喜欢
      • 2017-05-19
      • 2015-01-19
      • 2018-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多