我有一个使用XNA创建的WindowsGameLibrary(用C#编写)。它包括自己的Game类扩展。无论出于何种原因,LoadContent的重写版本永远不会被调用。我在论坛中读到,这可能是由于意外覆盖了Initialize而没有在最后添加base.Initialize(),但我确保有这个但它仍然不起作用。我会注意到包含Game扩展名的命名空间与其中包含“Program”类的实际WindowsGame项目的命名空间是分开的,尽管我认为这不重要。以下是我的代码:
public AttunedGame()
{
// Singleton
if (Instance == null) Instance = this;
this.currentArea = "";
}
protected override void Initialize()
{
// Managers
graphics = new GraphicsDeviceManager(this);
currentGameTime = new GameTime(new TimeSpan(0), new TimeSpan(0));
// Areas
areas = new CollectibleCollection<Area>();
foreach (string a in Directory.EnumerateDirectories(@"content\areas"))
{
areas.Add(new Area(a));
areas.Get(Collectible.IDFromPath(a)).Initialize();
}
base.Initialize();
}
protected override void LoadContent()
{
spriteBatch = new AnimatedSpriteBatch(this.GraphicsDevice);
}
// Main loop methods
protected override void Update(GameTime gameTime)
{
currentGameTime = gameTime;
CurrentArea.Update();
base.Update(gameTime);
}
protected override void Draw(GameTime gameTime)
{
currentGameTime = gameTime;
SpriteBatch.Begin();
CurrentArea.Draw();
SpriteBatch.End();
base.Draw(gameTime);
}
我在此处显示的每个方法中都放置了断点,以查看程序流程的去向。它首先点击构造函数,然后是Initialize(我一次逐行一行直到结束),然后进入Update,然后是Draw。我甚至让它循环了一段时间,它从未进入LoadContent。
非常感谢您的帮助。
答案 0 :(得分:1)
您实际上需要在构造函数中创建GraphicsDeviceManager。移动线:
graphics = new GraphicsDeviceManager(this);
来自内部
protected override void Initialize()
进入内部
public AttunedGame()
我的猜测是,XNA内部的某些内容需要在图形设备管理器加载内容之前进行初始化(可能服务容器需要制作图形设备以便它可以加载内容,例如纹理)。 LoadContent实际上是从基类Initialize中调用的,这可能会以某种方式失败;它确实应该抛出某种异常,但他们可能没想到这种情况。
希望有所帮助!