Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我必须在Game1类(XNA)中声明GraphicsDeviceManager?_C#_Xna - Fatal编程技术网

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

C# 为什么我必须在Game1类(XNA)中声明GraphicsDeviceManager?,c#,xna,C#,Xna,首先,我不熟悉C#和XNA(在C++之前) 我已经搜索了半个网页,我相信,整个stackoverflow,但我没有找到答案。 在我的项目中,我想创建一个GraphicsManager:它的工作将是加载/卸载开放世界游戏的资源,提供更多抽象的渲染工具(加载tileset、从tileset中拾取tile等),等等 这就是为什么将所有与图形相关的对象放在GraphicsManager中感觉很自然的原因 class GraphicsManager : Manager { // provided

首先,我不熟悉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";
}
过了一段时间,我发现我需要在初始化()之前创建GraphicsDeviceManager,因为它将强制它调用LoadContent()-我可以理解:GraphicsDeviceManager的构造函数对提供的游戏对象执行一些操作,以更改其Initialize()方法(或类似的方法)

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

只需在类中声明任何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
。有什么想法吗?

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

通常,您不希望为
游戏
子类指定构造函数。这很可能是与未调用
LoadContent
等相关的问题的原因。XNA的
Game
构造函数做了一些您没有在自己的构造函数中复制的事情,您也没有调用基本构造函数。我建议您在
初始化
加载内容
中执行所有需要执行的操作,而不是调用基本构造函数;这就是他们设计的目的

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

protected override void Initialize()
{
    Graphics.GraphicsManager.Instance.Initialize(this); 
    base.Initialize();
}
这是在
Game
子类中创建
GraphicsDeviceManager
对象的标准方法。在
Initialize
override中执行此操作,不要创建构造函数

另外,我建议不要为此创建一个单例,只需直接在
游戏
子类中添加一个
GraphicsManager
对象,这是合成的基本用法