2012-11-21 11 views
6

Così ho avviato il mio progetto attuale, e la prima cosa che ho fatto è stata lanciarlo, e mi ha dato l'eccezione di cui sopra. Stava andando bene ieri sera. Questo è tutto il codice nel mio evento Draw. spriteBatch.Begin non appare da nessun'altra parte nel progetto. Rimuovendo l'inizio qui fa sì che lo spriteBatch.Draw lanci un'eccezione, mettendo anche uno spriteBatch.End subito prima dell'inizio genera un'eccezione. Sono in perdita per ciò che è sbagliato e come risolvere questo problema.SpriteBatch: "Begin non può essere richiamato fino a quando End non è stato chiamato con successo."

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

Per una storia completa, potresti fornire i metodi di estrazione per giocatore e livello1? Poiché il problema potrebbe essere causato da quei metodi. –

+1

2 Posibilità: 1 | in player.draw o level1.draw chiami spritebatch.begin() 2 | spirteBatch.End() non viene chiamato perché non lo raggiungi. – Svexo

risposta

1

Beh ho bisogno di vedere il vostro levek1.Draw e player.Draw per le mie informazioni, ma ciò che im aspetta questo. In uno di questi metodi, chiami spriteBatch.Begin(), DEVI chiamare lo End() prima di chiamare questo.

Così, se il metodo di classe draw giocatore assomiglia a questo

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

È necessario rimuovere i Begin e End chiamate, perché sono stati già chiamati con il metodo del genitore.

EDIT: Non ho letto chiaramente, vedo che credi che questo non sia il problema, ma abbiamo bisogno di vedere gli altri metodi per capire il problema.

0

Premere ctrl+F e selezionare Entire Solution, cercare spriteBatch.Begin() e rimuoverlo dove non appartiene. Sospetto che potresti avere copie aggiuntive nelle tue chiamate a player o level.

Accertati anche di utilizzare la variabile corretta per il tuo gruppo sprite, può essere chiamato SpriteBatch, con la prima lettera in maiuscolo.

In ogni caso, è possibile provare a rimuovere (commentarli con //) tutte le chiamate spritebatch dal progetto e vedere se genera ancora un'eccezione.

1

È possibile che una delle chiamate in uscita stia generando un'eccezione. Questo ti butterebbe fuori dal metodo senza chiamare lo spriteBatch.End(), e poi la prossima volta otterrai un'eccezione su spriteBatch.Begin(). (Anche se io chiedo perché la prima eccezione non è finita il vostro programma, ma il secondo fatto.)

Se questo è il problema, una soluzione potrebbe essere quella di avvolgere le chiamate disegnare in un blocco try/finally:

Un'altra possibilità è che in realtà si sta chiamando accidentalmente spriteBatch.Begin() due volte. Personalmente evito di farlo avvolgendo l'oggetto SpriteBatch in una classe diversa.

Es:

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

ha avuto questo problema esatto me stesso, e nessuno dei suggerimenti lavorato qui. Alla fine, mi sono reso conto che nella mia sezione Begin/End ero await un metodo asincrono.

Avendo capito che questo avrebbe potenzialmente riavviato il metodo prima di finire, ho semplicemente aggiunto una variabile bool isDrawing e l'ho verificata prima del disegno.

HTH

Problemi correlati