繁体   English   中英

为什么我必须在Game1类(XNA)中声明GraphicsDeviceManager?

[英]Why do I have to declare GraphicsDeviceManager in Game1 class (XNA)?

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

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

这就是为什么将所有与图形相关的对象放在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 有任何想法吗?

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

通常,您不希望为Game子类指定构造函数。 这可能是导致你的问题与LoadContent没有被调用等有关的原因LoadContentGame构造函数做了一些你没有复制的东西,也没有调用基础构造函数。 我建议您在InitializeLoadContent完成所有需要的操作,而不是调用基础构造函数; 这就是他们的设计目标。

因此,取出你的Game类的构造函数(我还建议将其称为除了Game之外的东西,因为这也是XNA的类也称为),并将初始化移动到Game子类的Initialize

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

这是在Game子类中创建GraphicsDeviceManager对象的标准方法。 Initialize重写中执行,不要创建构造函数。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM