6

そこで、現在のプロジェクトを開始し、最初に実行したところ、上記の例外が発生しました。昨夜は順調でした。これが私の Draw イベントのすべてのコードです。spriteBatch.Begin は、プロジェクトの他の場所には表示されません。ここで 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);
4

5 に答える 5

1

さて、私はあなたのlevek1.Drawとplayer.Drawを見て私の情報を見る必要がありますが、これを期待しているのは何ですか。あなたのメソッドの1つで、あなたは呼び出しています、あなたはこれを呼び出す前に呼び出さspriteBatch.Begin()なければなりません。End()

したがって、プレーヤークラスの描画メソッドが次のようになっている場合

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

BeginEnd呼び出しは親メソッドによってすでに呼び出されているため、削除する必要があります。

編集:はっきりと読んでいませんでした、これは問題ではないとあなたは信じているようですが、問題を理解するために他の方法を見る必要があります。

于 2012-11-21T23:00:38.587 に答える
1

描画呼び出しの 1 つが例外をスローしている可能性があります。これにより、 を呼び出さずにメソッドから抜け出しspriteBatch.End()、次回は で例外が発生しspriteBatch.Begin()ます。(ただし、最初の例外でプログラムが終了しなかったのに、2 番目の例外で終了したのはなぜかと思います。)

それが問題である場合、1 つの解決策は、ドロー コールをtry/finallyブロックでラップすることです。

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

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

もう 1 つの可能性は、実際に誤ってspriteBatch.Begin()2 回呼び出していることです。個人的には、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 に答える
0

を押しctrl+Fて選択し、属していない場所をEntire Solution探して削除します。呼び出しまたは描画呼び出しspriteBatch.Begin()に余分なコピーがあるのではないかと思います。playerlevel

また、スプライト バッチに正しい変数を使用していることを確認してください。名前SpriteBatchの最初の文字が大文字になっている可能性があります。

とにかく、//プロジェクトからすべての spritebatch 呼び出しを削除 (コメントでコメント) してみて、まだ例外がスローされるかどうかを確認してください。

于 2012-11-21T23:05:58.377 に答える
0

描画中にスプライトバッチを終了すると、同じ問題が発生します。たとえば、タイマーなどの別のイベントから画面を離れたとき。

私の場合、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 に答える