Per i menu nel mio gioco, li disegno una volta sullo schermo, quindi li ridisegno solo se sono stati considerati sporchi. Questo viene gestito tramite un set booleano su true ogni volta che l'utente esegue un'azione che dovrebbe causare un ridisegno, e quindi il ciclo di disegno controllerà quel valore prima di disegnare il menu. Questa logica ha funzionato perfettamente in 3.1, ma in 4.0 il menu sfarfalla (disegnato per 1 fotogramma) quindi mostra una schermata viola fino a quando non viene nuovamente disegnato.XNA 3.1 a 4.0 richiede un ridisegno costante o visualizzerà una schermata viola
Ho creato un semplice gioco di prova in 4.0 per dimostrare il problema illustrato di seguito. Noterai che lo schermo sembra solo viola. Se rimuovi l'impostazione di riga _isDirty su false, vedrai lo sfondo bluette.
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
bool _isDirty = true;
public Game1()
{
graphics = new GraphicsDeviceManager(this);
}
protected override void Draw(GameTime gameTime)
{
if (_isDirty)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
_isDirty = false;
}
base.Draw(gameTime);
}
}
Come posso ottenere il comportamento da XNA 3.1? Ho visto diverse persone menzionare PreserveContents, ma questo non sembra avere alcun effetto in 4.0 a meno che non lo stia applicando in modo errato.
Perfetto! Grazie per aver dedicato del tempo al dettaglio del funzionamento interno di Draw, è esattamente ciò di cui avevo bisogno. –
Nota: come ho scoperto [qui sopra] (http://stackoverflow.com/a/16910684/165500), XNA contrassegna effettivamente un buffer come non inizializzato (cancella in viola scuro) durante "Presente", quindi il bit in la mia risposta sullo sfarfallio è sbagliata, anche se la soluzione è sempre la stessa. (Pentti [risposta] (http://stackoverflow.com/a/6283242/165500) qui ha dettagli sul meccanismo, anche se eviterei di spegnerlo con il martello che è riflesso. Molto più ragionevole usare correttamente l'API , come da mia risposta.) –
Ricevo "Il nome '_isDirty' non esiste nel contesto attuale" Errore. Usando XNA 4.0 e mettendo questo metodo nella classe Game1. Qualche idea? – Xonatron