2010-07-19 18 views
6

He escrito un motor de ejecución 2D Jump & que da como resultado una imagen de 320x224 (320x240). Para mantener la vieja escuela "pixely", me gusta, me gustaría escalar la imagen resultante por 2 o 3 o 4, de acuerdo con la resolución del usuario.Cómo escalar píxeles en pantalla?

No quiero escalar todos y cada uno de los sprites, ¡pero la imagen resultante!

Gracias de antemano :)

+0

¿Cuál es la pregunta? ¿Cómo mejorar una imagen? ¿O cómo implementar un efecto de "pixelado"? – Gobra

Respuesta

1

No estoy exactamente seguro de lo que quiere decir con "lo que resulta en una imagen ...", pero si usted quiere decir que su resultado final es una textura continuación, se puede dibujar que a la pantalla y establecer una escala:

spriteBatch.Draw(texture, position, source, color, rotation, origin, scale, effects, depth); 

Simplemente reemplace la báscula con el número que desee (2, 3 o 4). Hago algo similar, pero escalo por sprite y no la imagen resultante. Si quieres decir algo más, házmelo saber e intentaré ayudarte.

XNA se establece por defecto para suavizar la imagen escalada. Si desea conservar la bondad pixelada que necesita para dibujar en modo de clasificación inmediata y establecer algunos parámetros adicionales:

spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate, SaveStateMode.None); 
GraphicsDevice.SamplerStates[0].MagFilter = TextureFilter.Point; 
GraphicsDevice.SamplerStates[0].MinFilter = TextureFilter.Point; 
GraphicsDevice.SamplerStates[0].MipFilter = TextureFilter.Point; 

O es el punto o la Nada TextureFilter. Estoy en el trabajo, así que estoy tratando de recordar en la parte superior de mi cabeza. Confirmaré de una forma u otra más tarde hoy.

+0

De acuerdo con la documentación, 'TextureFilter.None' es solo para' MipFilter' para deshabilitarlo (y solo usar MagFilter). Probablemente * desea * establecer 'MipFilter = TextureFilter.None' para este efecto (y deje los otros como' Point'). –

+0

Acabo de buscarlo y es Punto que quieres – Bob

4

Bob's answer es correcto sobre cómo cambiar el modo de filtrado a TextureFilter.Point para mantener las cosas agradables y pixeladas.

Pero, posiblemente, un método mejor que escalar cada sprite (ya que también tendría que escalar la posición de cada sprite) es simplemente pasar una matriz a SpriteBatch.Begin, así:

sb.Begin(/* first three parameters */, Matrix.CreateScale(4f)); 

que le dará usted la escala que desea sin tener que modificar todas sus llamadas de sorteo.

Sin embargo, vale la pena señalar que, si utiliza desplazamientos de punto flotante en su juego, terminará con cosas no alineadas con los límites de píxeles después de ampliar (con cualquier método).

Existen dos soluciones para esto. La primera es tener una función como esta:

public static Vector2 Floor(Vector2 v) 
{ 
    return new Vector2((float)Math.Floor(v.X), (float)Math.Floor(v.Y)); 
} 

Y luego pasar su posición a través de la función que cada vez que se dibuja un sprite. Aunque esto podría no funcionar si tus sprites usan cualquier rotación o desplazamiento. Y de nuevo volverás a modificar cada llamada al sorteo.

La forma "correcta" de hacer esto, si desea una escalada de punto por punto de toda su escena, es dibujar su escena en un objetivo de renderizado en el tamaño original. Y luego dibuje su objetivo de renderizado en pantalla, ampliado (con TextureFilter.Point).

La función que desea ver es GraphicsDevice.SetRenderTarget. This MSDN article valdría la pena leerlo. Si está en o se muda a XNA 4.0, this might be worth reading.

No pude encontrar una muestra de XNA más simple para esto rápidamente, pero la muestra Bloom Postprocess usa un objetivo de renderizado al que aplica un sombreado de desenfoque. Simplemente podría ignorar el sombreador por completo y simplemente hacer el escalado.

3

Puede usar un efecto de pixelación. Dibuja un RenderTarget2D, luego dibuja el resultado en la pantalla usando un Pixel Shader. Hay una herramienta llamada Shazzam Shader editor que te permite probar los sombreadores de píxeles e incluye uno que lo haga pixelación: http://shazzam-tool.com/

Esto no puede ser lo que quería, pero podría ser bueno para permitir que un modo de alta resolución y para tienen el mismo efecto, no importa lo que la resolución fue utilizado ... Before

After

Cuestiones relacionadas