6

所以我启动了我当前的项目,我做的第一件事就是运行它,它给了我上面的异常。昨晚运行良好。这是我的 Draw 事件中的所有代码。spriteBatch.Begin 不会出现在项目的其他任何地方。在此处删除 Begin 会导致 spriteBatch.Draw 引发异常,将 spriteBatch.End 放在 begin 之前也会引发异常。我不知道出了什么问题以及如何解决这个问题。

GraphicsDevice.Clear(Color.CornflowerBlue);

spriteBatch.Begin();
spriteBatch.Draw(background, Vector2.Zero, Color.White);

player.Draw(spriteBatch);
level1.Draw(spriteBatch);

spriteBatch.End();

base.Draw(gameTime);
4

5 回答 5

1

您的一个绘图调用可能会引发异常。这将使您在不调用的情况下退出该方法spriteBatch.End(),然后在下一次通过时,您会在spriteBatch.Begin(). (虽然我想知道为什么第一个异常没有结束你的程序,但第二个却结束了。)

如果这是问题所在,一种解决方案是将绘图调用包装在try/finally块中:

spriteBatch.Begin();
spriteBatch.Draw(background, Vector2.Zero, Color.White);

try {
   player.Draw(spriteBatch);
   level1.Draw(spriteBatch);
} finally {
   spriteBatch.End();
}

另一种可能性是您实际上不小心调用spriteBatch.Begin()了两次。SpriteBatch就我个人而言,我通过将对象包装在不同的类中来避免这样做。

前任:

internal sealed class DrawParams
{
   private SpriteBatch mSpriteBatch;
   private bool mBegin;

   /// <summary>Calls SpriteBatch.Begin if the begin value is true. Always call this in a draw method; use the return value to determine whether you should call EndDraw.</summary>
   /// <returns>A value indicating whether or not begin was called, and thus whether or not you should call end.</returns>
   public bool BeginDraw()
   {
      bool rBegin = mBegin;

      if (mBegin)
      {
         mSpriteBatch.Begin();
         mBegin = false;
      }

      return rBegin;
   }

   /// <summary>Always calls SpriteBatch.End. Use the return value of BeginDraw to determine if you should call this method after drawing.</summary>
   public void EndDraw()
   {
      mSpriteBatch.End();
   }
}
于 2012-11-22T12:19:28.307 回答
1

好吧,我需要查看您的 levek1.Draw 和 player.Draw 以获取我的信息,但我对此有何期待。在其中一种方法中,您正在调用spriteBatch.Begin(),您必须End()在调用它之前调用。

因此,如果您的播放器类绘制方法如下所示

Draw(Spritebatch spriteBatch)
{
spriteBatch.Begin();
spriteBatch.Draw(PlayerSprite,PlayerPosition, etc);
spriteBatch.End();
}

您需要删除BeginandEnd调用,因为它们已被父方法调用。

编辑:没有读清楚,我看到你相信这不是问题,但我们需要看看其他方法来解决问题。

于 2012-11-21T23:00:38.587 回答
0

按下ctrl+F并选择,在不属于它Entire Solution的地方查找并删除它。spriteBatch.Begin()我怀疑您的playerlevel抽奖电话中可能有额外的副本。

还要确保你为你的精灵批次使用了正确的变量,它可能被称为SpriteBatch,首字母大写。

无论如何,您可以尝试//从您的项目中删除(用 注释它们)所有 spritebatch 调用,看看它是否仍然引发异常。

于 2012-11-21T23:05:58.377 回答
0

我自己有这个确切的问题,并且没有任何建议在这里起作用。最后,我意识到在我的 Begin / End 部分中,我正在await使用一个异步方法。

意识到这可能会在完成之前重新启动该方法,我只是添加了一个bool isDrawing变量并在绘制之前检查它。

高温高压

于 2013-12-18T08:31:14.417 回答
0

如果您在 spritebatch 忙于绘图时退出它,您将遇到同样的问题。例如,当您从另一个事件(例如计时器)离开屏幕时。

在我的例子中,我声明了一个私有变量来存储 SpriteBatch 是否被中断,

private bool _spriteBatchInterrupted = false;

并在 SpriteBatch 不断绘制时检查它,

    Game.SpriteBatch.Begin();
    if (_spriteBatchInterrupted)
    {
        Game.SpriteBatch.End();
        return;
    }...

然后在其他事件中设置该变量,例如,计时器已过事件

private void CountdownTimer_Elapsed(object sender, ElapsedEventArgs e)
{
   _spriteBatchInterrupted = true;
   NavigateTask();
}

     
于 2021-07-23T06:33:35.613 回答