2012-11-21 8 views
6

Also habe ich mein aktuelles Projekt gestartet, und das erste, was ich getan habe, war es, und es gab mir die obige Ausnahme. Es lief letzte Nacht gut. Das ist der ganze Code in meinem Draw-Event. spriteBatch.Begin wird nirgendwo sonst im Projekt angezeigt. Durch das Entfernen von "Begin here" löst die Funktion "spriteBatch.Draw" eine Ausnahme aus. Durch das Einfügen einer SpriteBatch.End-Anweisung direkt vor dem Beginn wird auch eine Ausnahme ausgelöst. Ich weiß nicht, was falsch ist und wie ich das beheben kann.SpriteBatch: "Begin kann nicht erneut aufgerufen werden, bis End erfolgreich aufgerufen wurde."

+1

Für eine komplette Geschichte, könnten Sie die Draw-Methoden für Spieler und Level1 bieten? Da das Problem in diesen Methoden verursacht werden kann. –

+1

2 Möglichkeiten: 1 | entweder in player.draw oder level1.draw du rufst spritebatch.begin() 2 | spirteBatch.End() wird nicht aufgerufen, weil Sie es nicht erreichen. – Svexo

Antwort

1

Nun, ich muss sehen, Ihre levek1.Draw und player.Draw für meine Informationen, aber was ich erwartet dies. In einer von Ihnen Methoden rufen Sie spriteBatch.Begin() an, Sie MÜSSEN End() aufrufen, bevor Sie dieses aufrufen.

Also, wenn Ihr Spielerklasse Draw-Verfahren sieht wie folgt aus

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

Sie müssen die Begin und End Anrufe entfernen, da sie bereits von der Mutter Methode aufgerufen wurden.

EDIT: Ich habe nicht klar gelesen, ich sehe Sie glauben, dass dies nicht das Problem ist, aber wir müssen die anderen Methoden sehen, um das Problem zu lösen.

0

Drücken Sie ctrl+F und wählen Sie Entire Solution, suchen Sie nach spriteBatch.Begin() und entfernen Sie es, wo es nicht hingehört. Ich vermute, dass Sie möglicherweise zusätzliche Kopien in Ihren player oder level Aufrufe haben.

Vergewissern Sie sich auch, dass Sie die richtige Variable für Ihre Sprite-Charge verwenden. Sie kann SpriteBatch heißen, wobei der erste Buchstabe groß geschrieben ist.

Wie auch immer, Sie können versuchen, alle Spritebatch-Aufrufe von Ihrem Projekt zu entfernen (kommentieren Sie sie mit //) und sehen, ob es immer noch eine Ausnahme auslöst.

1

Es ist möglich, dass einer Ihrer Draw-Aufrufe eine Ausnahme auslöst. Dies würde Sie aus der Methode ohne Aufruf spriteBatch.End(), und dann das nächste Mal durch, erhalten Sie eine Ausnahme auf spriteBatch.Begin(). (Obwohl ich würde fragen, warum die erste Ausnahme nicht das Programm beenden, aber die zweiten tat.)

Wenn das das Problem ist, wäre eine Lösung, die Auslosung Anrufe in einem try/finally Block zu wickeln sein:

Eine andere Möglichkeit ist, dass Sie versehentlich versehentlich spriteBatch.Begin() anrufen. Persönlich vermeide ich dies, indem ich das Objekt SpriteBatch in eine andere Klasse hüllte.

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

Hatte genau dieses Problem selbst, und keiner der Vorschläge arbeitete hier an. Schließlich erkannte ich, dass ich in meinem Anfang/Ende-Abschnitt eine asynchrone Methode war.

Nachdem festgestellt wurde, dass dies möglicherweise dann die Methode vor der Fertigstellung neu starten würde, fügte ich einfach eine bool isDrawing Variable hinzu und überprüfte sie vor dem Zeichnen.

HTH

Verwandte Themen