2011-09-29 12 views
9

Utilizzando XNA, che sto cercando di fare un motore di gioco di avventura che permette di effettuare giochi che sembrano caduti fuori dai primi anni '90, come Day of the Tentacle e Sam & Max Hit la strada. Quindi, voglio che il gioco funzioni effettivamente a 320x240 (lo so, probabilmente dovrebbe essere 320x200, ma shh), ma dovrebbe scalare in base alle impostazioni dell'utente.Scaling intero schermo in XNA

Al momento funziona, ma sto riscontrando alcuni problemi in cui desidero effettivamente che appaia altro pixellato che al momento funziona.

Ecco quello che sto facendo in questo momento:

Nell'inizializzazione gioco:

public Game() { 
     graphics = new GraphicsDeviceManager(this); 
     graphics.PreferredBackBufferWidth = 640; 
     graphics.PreferredBackBufferHeight = 480; 
     graphics.PreferMultiSampling = false; 

     Scale = graphics.PreferredBackBufferWidth/320; 
    } 

Scale è una variabile statica pubblica che posso controllare in qualsiasi momento per vedere quanto avrei dovuto scalare il mio gioco relative a 320x240.

Nella mia funzione di disegno:

spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.NonPremultiplied, SamplerState.PointClamp, DepthStencilState.Default, RasterizerState.CullNone, null, Matrix.CreateScale(Game.Scale)); 

In questo modo, tutto è disegnato a 320x240 e fatto saltare in aria per adattarsi alla risoluzione corrente (640x480 per impostazione predefinita). E naturalmente faccio matematica per convertire le coordinate reali del mouse in coordinate 320x240 e così via.

Ora, questo è bello e tutto, ma ora sto arrivando al punto in cui voglio iniziare a ridimensionare i miei spiriti, farli camminare in lontananza e così via.

Guarda le immagini qui sotto. L'immagine in alto a sinistra è una porzione di uno screenshot da quando il gioco è in esecuzione a 640x480. L'immagine alla sua destra è come dovrebbe "apparire", a 320x240. La riga inferiore delle immagini è solo la riga superiore esplosa al 300% (in Photoshop, non nel motore) in modo da poter vedere di cosa sto parlando.

image showing the difference in scaling as the resolution changes

Nell'immagine 640x480, è possibile vedere diversi "spessori di linea;" le linee più spesse sono come dovrebbe apparire (un pixel = 2x2, perché è in esecuzione a 640x480), ma anche le linee più sottili (1x1 pixel) appaiono, quando non dovrebbero, a causa del ridimensionamento (vedi le immagini a destra).

Fondamentalmente sto tentando di emulare un display 320x240 ma fatto esplodere a qualsiasi risoluzione utilizzando XNA e le trasformazioni della matrice non stanno facendo il trucco. C'è un modo per fare questo?

risposta

14

Render tutto nella risoluzione nativa a un RenderTarget al posto del back buffer:

 SpriteBatch targetBatch = new SpriteBatch(GraphicsDevice); 
     RenderTarget2D target = new RenderTarget2D(GraphicsDevice, 320, 240); 
     GraphicsDevice.SetRenderTarget(target); 

     //perform draw calls 

Poi rendere questo obiettivo (il vostro intero schermo) per il back buffer:

 //set rendering back to the back buffer 
     GraphicsDevice.SetRenderTarget(null); 

     //render target to back buffer 
     targetBatch.Begin(); 
     targetBatch.Draw(target, new Rectangle(0, 0, GraphicsDevice.DisplayMode.Width, GraphicsDevice.DisplayMode.Height), Color.White); 
     targetBatch.End(); 
+1

Grazie un mazzo! Ho fatto in modo che l'ultimo SpriteBatch chiamasse a: spriteBatch.Begin (SpriteSortMode.Deferred, BlendState.NonPremultiplied, SamplerState.PointClamp, DepthStencilState.Default, RasterizerState.CullNone); per fare in modo che la proiezione non appaia sfocata, ma sembra fantastica! Grazie ancora! –