Có thể một trong các cuộc gọi vẽ của bạn là ném một ngoại lệ. Điều này sẽ ném bạn ra khỏi phương pháp mà không cần gọi spriteBatch.End()
, và sau đó trong thời gian tới thông qua, bạn sẽ nhận được một ngoại lệ trên spriteBatch.Begin()
. (Mặc dù tôi sẽ tự hỏi tại sao các ngoại lệ đầu tiên đã không kết thúc chương trình của bạn, nhưng điều thứ hai đã làm.)
Nếu đó là vấn đề, một giải pháp sẽ được quấn các cuộc gọi hòa trong một khối try
/finally
:
spriteBatch.Begin();
spriteBatch.Draw(background, Vector2.Zero, Color.White);
try {
player.Draw(spriteBatch);
level1.Draw(spriteBatch);
} finally {
spriteBatch.End();
}
Một khả năng khác là bạn thực sự vô tình gọi số spriteBatch.Begin()
hai lần. Cá nhân tôi tránh làm điều này bằng cách gói các đối tượng SpriteBatch
trong một lớp khác nhau.
Ex:
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();
}
}
Nguồn
2012-11-22 12:19:28
Để biết câu chuyện hoàn chỉnh, bạn có thể cung cấp phương pháp vẽ cho người chơi và cấp 1 không? Vì vấn đề có thể được gây ra trong các phương pháp đó. –
2 Khả năng: 1 | hoặc trong player.draw hoặc level1.draw bạn gọi spritebatch.begin() 2 | spirteBatch.End() không được gọi vì bạn không liên lạc với nó. – Svexo