[英]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
没有被调用等有关的原因LoadContent
的Game
构造函数做了一些你没有复制的东西,也没有调用基础构造函数。 我建议您在Initialize
或LoadContent
完成所有需要的操作,而不是调用基础构造函数; 这就是他们的设计目标。
因此,取出你的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.