1

首先,我是 C# 和 XNA 的新手(在 C++ 之前)

我已经搜索了一半的网络,并且我相信整个 stackoverflow,但我没有找到答案。在我的项目中,我想创建一个 GraphicsManager:它的工作是为开放世界游戏加载/卸载资源,提供更抽象的渲染工具(加载瓦片集,从瓦片集中选择瓦片等)等等。

这就是为什么将所有与图形相关的对象放在 GraphicsManager 中感觉很自然的原因。

class GraphicsManager : Manager
{
    // provided by XNA project
    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;

    public override void Initialize(Game caller)
    {
        mainObj = caller;
        graphics = new GraphicsDeviceManager(mainObj);
    }
}

// constructor of the Game class
public Game()
{     
    Graphics.GraphicsManager.Instance.Initialize(this);
    Content.RootDirectory = "Content";
}

一段时间后我发现我需要在 Initialize() 之前创建 GraphicsDeviceManager,因为它会强制它调用 LoadContent() - 我可以理解:GraphicsDeviceManager 的构造函数对提供的 Game 对象执行一些操作以更改其 Initialize()方法(或类似的东西)。

这就是我更改代码的原因,所以它在 Game 的构造函数中运行 GraphicManager 的 Initialize()。不幸的是,这样它就不会调用 LoadContent()。为什么?

PS。只需在类中声明任何 GraphicsDeviceManager 对象就足够了,无需实例化 - 然后它将起作用。对我来说完全是无稽之谈 :/

@Scott W我删除了Game构造函数,将类重命名为(为Game1)并创建了这个方法:

protected override void Initialize()
    {
        // TODO: Add your initialization logic here
        Graphics.GraphicsManager.Instance.Initialize(this);

        Content.RootDirectory = "Content";

        base.Initialize();
    }

但现在它不会调用LoadContent. 有任何想法吗?

4

1 回答 1

3

严格来说,您不需要子类中创建GraphicsDeviceManager对象Game。但是,在创建时,它通常需要一个Game实例(或子类实例,例如Game1)。

通常你不想为你的Game子类指定一个构造函数。这可能是您与LoadContent未调用等相关问题的原因。XNA 的Game构造函数做了一些您没有在您的构造函数中复制的事情,您也没有调用基本构造函数。Initialize我建议不要调用基本构造函数,而是在or中做所有你需要做的事情LoadContent;这就是他们的设计目的。

因此,取出您的Game类的构造函数(我还建议将其Game称为 XNA 的类以外的其他名称),并将初始化移动到您的Game子类中Initialize

protected override void Initialize()
{
    Graphics.GraphicsManager.Instance.Initialize(this); 
    base.Initialize();
}

这是在子类中创建GraphicsDeviceManager对象的标准方法Game。在Initialize覆盖中执行此操作,并且不要创建构造函数。

另外,我建议不要为此创建一个单例,而只是GraphicsManager直接在您的子类中添加一个对象Game,这是组合的基本用法。

于 2013-11-03T09:20:18.587 回答