2012-11-21 38 views
6

Vì vậy, tôi đã bắt đầu dự án hiện tại của mình và điều đầu tiên tôi làm là chạy nó và nó đã cho tôi ngoại lệ trên. Nó đã hoạt động tốt đêm qua. Đây là tất cả mã trong sự kiện Vẽ của tôi. spriteBatch.Begin không xuất hiện ở bất kỳ nơi nào khác trong dự án. Loại bỏ bắt đầu ở đây gây ra các spriteBatch.Draw để ném một ngoại lệ, đặt một spriteBatch.End ngay trước khi bắt đầu cũng ném một ngoại lệ. Tôi đang thua lỗ vì có gì sai và cách sửa lỗi này.SpriteBatch: "Bắt đầu không thể được gọi lại cho đến khi End được gọi thành công."

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

Để 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 đó. –

+1

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

Trả lời

1

Tôi cần xem levek1.Draw và player.Draw để biết thông tin của tôi, nhưng những gì tôi mong đợi. Trong một trong các phương pháp, bạn đang gọi số spriteBatch.Begin(), bạn PHẢI gọi End() trước khi gọi điện.

Vì vậy, nếu người chơi phương thức lớp bốc thăm của bạn trông như thế này

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

Bạn cần phải loại bỏ các BeginEnd cuộc gọi, bởi vì họ đã được gọi là theo phương pháp cha mẹ.

EDIT: Không đọc rõ ràng, tôi thấy bạn tin rằng đây không phải là vấn đề, nhưng chúng ta cần phải xem các phương pháp khác để tìm ra vấn đề.

0

Bấm ctrl+F và chọn Entire Solution, tìm kiếm spriteBatch.Begin() và xóa nó ở nơi không thuộc về. Tôi nghi ngờ bạn có thể có thêm các bản sao trong các cuộc gọi vẽ player hoặc level vẽ của bạn.

Ngoài ra hãy đảm bảo bạn đang sử dụng biến đúng cho lô sprite của mình, nó có thể được gọi là SpriteBatch, với chữ cái viết hoa đầu tiên.

Dù sao, bạn có thể thử xóa (nhận xét chúng bằng //) tất cả các cuộc gọi spritebatch từ dự án của bạn và xem liệu nó có còn ném ngoại lệ hay không.

1

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(); 
    } 
} 
0

có vấn đề này chính xác bản thân mình, và không ai trong số những đề nghị làm việc ở đây. Cuối cùng, tôi nhận ra rằng trong phần Bắt đầu/Kết thúc, tôi đã await nhập một phương thức không đồng bộ.

Sau khi nhận ra rằng điều này có khả năng sẽ khởi động lại phương thức trước khi hoàn thành, tôi chỉ cần thêm biến số bool isDrawing và kiểm tra nó trước khi vẽ.

HTH

Các vấn đề liên quan