0

我正在使用 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:这只发生在我尝试绘制纹理时,我可以很好地绘制字符串。

4

0 回答 0