描画呼び出しの 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();
}
}