Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SpriteBatch:“您必须遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他有关法律法规。”;在成功调用End之前,不能再次调用Begin;_C#_Exception_Xna_Spritebatch - Fatal编程技术网

C# SpriteBatch:“您必须遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他有关法律法规。”;在成功调用End之前,不能再次调用Begin;

C# SpriteBatch:“您必须遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他有关法律法规。”;在成功调用End之前,不能再次调用Begin;,c#,exception,xna,spritebatch,C#,Exception,Xna,Spritebatch,所以我启动了我当前的项目,我做的第一件事就是运行它,它给了我上述的例外。昨晚天气很好。这是我的绘图事件中的所有代码。spriteBatch.Begin不会出现在项目中的任何其他位置。删除此处的开始会导致spriteBatch.Draw引发异常,将spriteBatch.End放在开始之前也会引发异常。我不知道出了什么问题以及如何解决这个问题 GraphicsDevice.Clear(Color.CornflowerBlue); spriteBatch.Begin(); spriteBatch.

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

GraphicsDevice.Clear(Color.CornflowerBlue);

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

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

spriteBatch.End();

base.Draw(gameTime);

好吧,我需要看看你的列队1。抽签和球员。抽签以获取我的信息,但我期待这一切。在其中一个方法中,您正在调用
spriteBatch.Begin()
,在调用此方法之前必须调用
End()

所以如果你的玩家类绘制方法是这样的

Draw(Spritebatch spriteBatch)
{
spriteBatch.Begin();
spriteBatch.Draw(PlayerSprite,PlayerPosition, etc);
spriteBatch.End();
}
您需要删除
Begin
End
调用,因为它们已被父方法调用


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

ctrl+F
并选择
整个解决方案
,查找
spriteBatch.Begin()
,然后将其移到不属于它的地方。我怀疑您的
播放器
级别
抽签呼叫中可能有额外副本

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


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

您的一个draw调用可能正在引发异常。如果不调用
spriteBatch.End()
,这将使您退出该方法,然后下一次通过时,您将在
spriteBatch.Begin()
上遇到异常。(虽然我想知道为什么第一个异常没有结束您的程序,但第二个异常结束了。)

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

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

try {
   player.Draw(spriteBatch);
   level1.Draw(spriteBatch);
} finally {
   spriteBatch.End();
}
另一种可能是您实际上无意中调用了两次
spriteBatch.Begin()
。就我个人而言,我通过将
SpriteBatch
对象包装到另一个类中来避免这样做

例:

内部密封类DrawParams
{
私人SpriteBatch mSpriteBatch;
私人布尔·姆贝金;
///调用SpriteBatch.Begin(如果Begin值为true)。始终在draw方法中调用此函数;使用返回值确定是否应调用EndDraw。
///一个值,指示是否调用begin,从而指示是否应调用end。
公共布尔贝金德劳()
{
布尔·尔贝金=姆贝金;
如果(姆贝金)
{
mSpriteBatch.Begin();
姆贝金=假;
}
返回rBegin;
}
///始终调用SpriteBatch.End。使用BeginDraw的返回值确定是否应在绘制后调用此方法。
公共无效EndDraw()
{
mSpriteBatch.End();
}
}

我自己也有这个问题,这里没有一个建议有效。最后,我意识到在我的开始/结束部分,我正在等待一个异步方法

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


HTH

对于一个完整的故事,你能提供玩家和一级的抽签方法吗?因为问题可能是由这些方法引起的。2个可能性:1 |在player.draw或level1.draw中调用spritebatch.begin()2 | spritebatch.End()不会被调用,因为您没有到达它。
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();
   }
}