2012-11-21 12 views
6

Więc zacząłem mój obecny projekt, a pierwszą rzeczą, którą zrobiłem, było uruchomienie go i dało mi powyższy wyjątek. Wczoraj w nocy wszystko było w porządku. To wszystko jest kodem w moim losowaniu. spriteBatch.Begin nie pojawia się nigdzie indziej w projekcie. Usunięcie Begin tutaj powoduje, że spriteBatch.Draw rzuca wyjątek, umieszczając spriteBatch.End tuż przed rozpoczęciem również zgłasza wyjątek. Nie rozumiem, co jest nie tak i jak to naprawić.SpriteBatch: "Begin nie może zostać wywołany ponownie, dopóki nie zostanie wywołany 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); 
+1

Czy możesz podać metody losowania dla gracza i poziomu 1? Ponieważ problem może wynikać z tych metod. –

+1

2 Możliwości: 1 | albo w player.draw lub level1.drawisz wywołanie spritebatch.begin() 2 | Funkcja spirteBatch.End() nie zostaje wywołana, ponieważ jej nie osiągasz. – Svexo

Odpowiedz

1

Muszę zobaczyć twój levek1.Draw i player.Draw dla mojej informacji, ale co im się to spodziewam. W jednej z metod dzwonisz pod numer spriteBatch.Begin(), zanim zadzwonisz, musisz zadzwonić pod numer End().

Więc jeśli gracz metoda klasy losowanie wygląda to

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

musisz usunąć Begin i End połączeń, ponieważ zostały one już nazywana metodą dominującą.

EDYCJA: Nie czytałem wyraźnie, widzę, że wierzysz, że to nie jest problem, Ale musimy zobaczyć inne metody, aby dowiedzieć się problem.

0

Naciśnij przycisk ctrl+F i wybierz opcję Entire Solution, poszukaj spriteBatch.Begin() i usuń ją tam, gdzie nie należy. Podejrzewam, że możesz mieć dodatkowe kopie w swoich połączeniach rysowania player lub level.

Upewnij się również, że używasz odpowiedniej zmiennej do partii duszków. Może ona być nazywane SpriteBatch, z wielką literą.

W każdym razie możesz spróbować usunąć (skomentuj je za pomocą //) wszystkie wywołania spritebatch z twojego projektu i sprawdzić, czy nadal zgłasza wyjątek.

1

Możliwe, że jedno z twoich połączeń rysujących rzuca wyjątek. To wyrzuciłoby Cię z metody bez wywoływania spriteBatch.End(), a następnie następnym razem otrzymasz wyjątek od spriteBatch.Begin(). (Chociaż ja zastanawiam się, dlaczego pierwszy wyjątek nie zakończyła swój program, ale drugi nie.)

Jeśli to jest problem, jedno rozwiązanie byłoby zawinąć wywołania rozciągania w try/finally bloku:

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

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

Inną możliwością jest dwukrotne przypadkowe wywołanie spriteBatch.Begin(). Osobiście unikam tego, owijając obiekt SpriteBatch w innej klasie.

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

Gdyby dokładnie ten sam problemu, a żadna z sugestii pracował tutaj. W końcu, zdałem sobie sprawę, że w mojej sekcji Początek/Koniec byłem await dla metody asynchronicznej.

Po zdaniu sobie sprawy, że to potencjalnie uruchomi ponownie metodę przed zakończeniem, po prostu dodałem zmienną bool isDrawing i sprawdziłem ją przed rysowaniem.

HTH

Powiązane problemy