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