【问题标题】:Why do I have to declare GraphicsDeviceManager in Game1 class (XNA)?为什么我必须在 Game1 类 (XNA) 中声明 GraphicsDeviceManager?
【发布时间】:2013-11-05 04:08:26
【问题描述】:

首先,我是 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 对象就足够了,无需实例化 - 然后它将起作用。这对我来说毫无意义:/

@斯科特·W 我删除了Game 构造函数,将类重命名为Game1,并创建了这个方法:

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

        Content.RootDirectory = "Content";

        base.Initialize();
    }

但现在它不会调用LoadContent。有什么想法吗?

【问题讨论】:

    标签: c# xna


    【解决方案1】:

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

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

    所以取出Game 类的构造函数(我还建议将其称为Game 以外的其他名称,因为这也是XNA 的类的名称),并将初始化移至Game 子类的Initialize:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-28
      相关资源
      最近更新 更多