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.
¿Cuál es la pregunta? ¿Cómo mejorar una imagen? ¿O cómo implementar un efecto de "pixelado"? – Gobra