2011-09-29 16 views
9

El uso de XNA, yo estoy tratando de hacer un motor de juego de aventura que le permite hacer juegos que parecen que se cayó de la década de los 90, como día del tentáculo y Sam & Max Hit el camino. Por lo tanto, quiero que el juego se ejecute realmente a 320x240 (lo sé, probablemente debería ser 320x200, pero shh), pero debería ampliarse según la configuración del usuario.Escala pantalla entera en XNA

Funciona bastante bien en este momento, pero estoy teniendo algunos problemas donde realmente quiero que se vea más pixelado que lo hace actualmente.

Aquí es lo que estoy haciendo ahora:

En el juego de inicialización:

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

     Scale = graphics.PreferredBackBufferWidth/320; 
    } 

La escala es una variable estática pública que puedo comprobar en cualquier momento para ver lo mucho que debe escalar mi juego relativa a 320x240.

En mi función de dibujo:

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

De esta manera, todo lo que se dibuja en 320x240 y volado para adaptarse a la actual resolución (640x480 por defecto). Y, por supuesto, hago las matemáticas para convertir las coordenadas reales del mouse en coordenadas de 320x240, y así sucesivamente.

Ahora, esto es genial y todo, pero ahora estoy llegando al punto en el que quiero comenzar a escalar mis sprites, hacer que caminen en la distancia y así sucesivamente.

Mira las imágenes a continuación. La imagen superior izquierda es una parte de una captura de pantalla desde cuando el juego se ejecuta a 640x480. La imagen a la derecha es como debería verse, a 320x240. La fila inferior de imágenes es solo la fila superior impresa al 300% (en Photoshop, no en el motor) para que pueda ver de lo que estoy hablando.

image showing the difference in scaling as the resolution changes

En la imagen de 640x480, se puede ver diferente "grosores de línea"; las líneas más gruesas son como debería verse realmente (un píxel = 2x2, porque se está ejecutando a 640x480), pero las líneas más delgadas (1x1 píxeles) también aparecen, cuando no deberían, debido a la escala (ver las imágenes de la derecha)

Básicamente, estoy tratando de emular una pantalla de 320x240 pero exploté a cualquier resolución usando XNA, y las transformaciones de la matriz no están haciendo el truco. ¿Hay alguna manera de que yo pueda hacer esto?

Respuesta

14

Render todo en la resolución nativa a un RenderTarget en lugar del búfer de reserva:

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

     //perform draw calls 

A continuación, hacer que este objetivo (el conjunto de pantalla) para el búfer de reserva:

 //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

gracias un montón! Hice que la última llamada de SpriteBatch fuera: spriteBatch.Begin (SpriteSortMode.Deferred, BlendState.NonPremultiplied, SamplerState.PointClamp, DepthStencilState.Default, RasterizerState.CullNone); para que la proyección no se vea borrosa, ¡pero se ve genial! ¡Gracias de nuevo! –