您的一個繪圖調用有可能拋出異常。這會讓你不用撥打電話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();
}
}
對於一個完整的故事,你能提供玩家和level1的繪製方法嗎?因爲這些問題可能是由這些方法引起的。 –
2可能性:1 |或者在player.draw或者level1.draw中調用spritebatch.begin()2 | spirteBatch.End()不會被調用,因爲你沒有達到它。 – Svexo