Ich versuche, mein erstes XNA-Spiel zu schreiben, und ich möchte ALT + ENTER-Funktionalität enthalten, um zwischen Vollbildmodus und Fenstermodus umzuschalten. Mein Spiel ist momentan extrem einfach, nichts Besonderes. Ich kann es entweder in Fenster (Standard) oder Vollbild (durch Aufruf von ToggleFullScreen) in meiner LoadContent-Funktion ausführen, und alles funktioniert gut.ToggleFullScreen in XNA verursacht verlorene Geräte wie Fehler
Wenn ich jedoch ToggleFullScreen in meiner Update-Funktion unter Verwendung des exakt gleichen Codes aufrufen, schlägt mein Spiel fehl. Wenn ich windowed starte und auf Vollbild umschalte, scheint es einzufrieren, es wird nur ein Frame angezeigt und keine Tastatureingabe akzeptiert (ich muss STRG + ALT + ENTF drücken). Wenn ich fullscreen starte und auf windowed umschalte, wird ein Fehler in DrawIndexedPrimitive mit der Meldung "Die aktuelle Vertex-Deklaration enthält nicht alle vom aktuellen Vertex-Shader benötigten Elemente. Normal0 fehlt." (Das ist nicht wahr; mein Vertex-Puffer ist VertexPositionNormalTexture und enthält Daten, und der GraphicsDevice-Status ist Normal).
Beide Probleme scheinen irgendwie auf eine verlorene Verbindung mit dem Gerät zu verweisen, aber ich kann nicht herausfinden, warum. Jede Ressource, die ich online gefunden habe, sagt, das Umschalten im Vollbildmodus ist so einfach wie das Aufrufen der ToggleFullScreen-Funktion, ohne dass das Zurücksetzen von Geräten oder Puffern erwähnt wird. Irgendwelche Ideen?
Edit: Hier ist ein Code, mit fremden Sachen aus links:
protected override void LoadContent()
{
graphics.PreferredBackBufferWidth = 800;
graphics.PreferredBackBufferHeight = 600;
graphics.ToggleFullScreen();
basicEffect = new BasicEffect(graphics.GraphicsDevice);
// etc.
}
protected override void Update(GameTime gameTime)
{
if (k.IsKeyDown(Keys.Enter) && (k.IsKeyDown(Keys.LeftAlt) || k.IsKeyDown(Keys.RightAlt)) && !oldKeys.Contains(Keys.Enter)) {
graphics.ToggleFullScreen();
gameWorld.Refresh();
}
// update the world's graphics; this fills my buffers
GraphicsBuffers gb = gameWorld.Render(graphics.GraphicsDevice);
graphics.GraphicsDevice.SetVertexBuffer(gb.vb, 0);
graphics.GraphicsDevice.Indices = gb.ib;
}
protected override void Draw(GameTime gameTime)
{
// buffer reference again; these are persistent once filled in Update, they don't get created anew
GraphicsBuffers gb = gameWorld.Render(graphics.GraphicsDevice);
foreach (EffectPass effectPass in basicEffect.CurrentTechnique.Passes)
{
effectPass.Apply();
basicEffect.Texture = textures;
graphics.GraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, gb.vb.VertexCount, 0, gb.ib.IndexCount/3);
}
}
Können Sie einen Code eingeben? –