我正在使用 MonoGame 为 Windows Phone 8 开发一个小游戏。最近我的游戏开始随机崩溃,出现 NullReference 异常。Visual Studio 指出 spriteBatch.End() 方法,但它发生在 MonoGame 库中的某个地方。
游戏以启动屏幕开始,然后是开始屏幕,出现一个短篇故事,然后开始游戏。例外只发生在游戏中,但它发生在随机时刻。有时是 2 秒的游戏,有时是 2 分钟。有时它发生在第一次触摸动作时,有时我根本不触摸并且仍然发生异常。
我在屏幕的某个特定区域遇到了触摸问题,我不得不从 GamePage.xaml 中删除 StackFrame 来解决它,并尝试通过从另一个 GamePage.xaml 复制来添加它。此外,我使用 spriteBatch.Begin() 方法和 2 个参数覆盖来摆脱预乘 alpha。我没有想到任何其他更改,但由于我的主管,我现在无法发布任何代码。如果有必要,我可以说服他。
编辑:我的项目中有不同的游戏屏幕,这个异常只发生在“级别”、“信用”等工作正常。我评论了所有 Update 方法,即使我尝试绘制简单的背景,Draw 也会发生异常。
Game1.cs
protected override void Draw(GameTime gameTime)
{
spriteBatch.Begin();
base.Draw(gameTime);
ScreenManager.Instance.Draw(spriteBatch);
spriteBatch.End();
}
ScreenManager.cs(Singleton class)
public void Draw(SpriteBatch spriteBatch)
{
if (!this.Paused) currentScreen.Draw(spriteBatch);
else PauseMenu.Draw(spriteBatch);
}
Level.cs(currentScreen is a Level everytime this happens)
public override void Draw(SpriteBatch spriteBatch)
{
base.Draw(spriteBatch);
if (!completed)
{
//Commented bla bla that draws everything else
}
}
GameScreen.cs(Base class of Level)
public virtual void Draw(SpriteBatch spriteBatch)
{
spriteBatch.Draw(image, new Vector2(480, 0), null, this.Color,
(float)(Math.PI / 2), new Vector2(0, 0), 1f, SpriteEffects.None, 0);
}
使用 XmlManager 类逐行读取 XML 文件中的级别数据,parseXml 方法创建一个级别并根据 Xml 文件分配加载其属性,返回该级别。
ScreenManager.Instance.currentScreen =
ScreenManager.Instance.manager.ParseXml(this.Content, "Level" +
++ScreenManager.Instance.CurrentLevelId + ".xml");
这就是 Levels 的初始化方式。
EDIT2:这只发生在我尝试绘制纹理时,我可以很好地绘制字符串。