Tomar Screenshots o Pantallazos de los Juegos en XNA


Voy a mostrar como tomar pantallazos de los juegos o aplicaciones que tengamos en XNA, voy a usar el proyecto del Juego de la culebrita y a modificarlo.

Necesitamos una textura que será la encargada de tener el pantallazo, y un objeto RenderTarget2D, que servirá para renderizar la escena a una textura.

Declaramos las variables:

Texture2D screenshot;
RenderTarget2D screenshotTarget;


Inicializamos el RenderTarget2D en el LoadContent:

screenshotTarget = new RenderTarget2D(
                GraphicsDevice,
                this.Window.ClientBounds.Width,
                this.Window.ClientBounds.Height,
                0,
                SurfaceFormat.Color);

El RenderTarget2D recibe como parámetros el dispositivo grafico asociado, también recibe como parámetros el tamaño que va a tener la parte de la escena que se va a renderizar, en este ejemplo vamos a renderizar toda la escena, por lo que enviamos el tamaño total de la ventana, el tercer parámetro es para el número de superficies en que se procesa la textura, la verdad aún no he tenido mucho contacto con este parámetro, en nuestro caso enviamos un 0, el último parámetro es el formato de la superficie.

Ahora vamos a modificar el Dibujado de nuestro juego, para que se llame en una función aparte del Draw, el Draw ahora queda así:

protected override void Draw(GameTime gameTime)
{
  DibujarEscenario();
  // TODO: Add your drawing code here
  base.Draw(gameTime);
}

private void DibujarEscenario()
{
 GraphicsDevice.Clear(Color.CornflowerBlue);
 mCabeza.Dibujar();
 mComida.Dibujar();
 //Dibujar el cuerpo
 foreach (Pieza aPieza in mColas.Values)
 {
   aPieza.Dibujar();
 }
 spriteBatch.Begin();
 spriteBatch.DrawString(puntuacion, "Puntuacion: " +      mPuntuacion.ToString(), new Vector2(38, 8), Color.White);
 spriteBatch.End();
}

Ahora, vamos a crear el método encargado de tomar el ScreenShot y guardar la imagen resultante en el disco:

private void CapturarScreenShot()
{
  GraphicsDevice.SetRenderTarget(0, screenshotTarget);
  DibujarEscenario();
  GraphicsDevice.SetRenderTarget(0, null);
  screenshot = screenshotTarget.GetTexture();
  screenshot.Save("screenshot.png", ImageFileFormat.Png);
}

–          Le decimos al dispositivo grafico que RenderTarget vamos a usar

–          Dibujamos la escena

–          Limpiamos el RenderTarget enviando un nulo en el segundo parámetro del SetRenderTarget

–          Extraemos la textura del RenderTarget y la copiamos a la variable

–          Guardamos la textura en el disco, llamando la función Save de la textura

Ahora lo que queda es modificar el Update para que cuando se presione la tecla P, se llame la función CapturarScreenShot()

He modificado el código para tener un contador de los ScreenShot, en el siguiente video pueden ver como ha quedado todo:

Deseas comentar o sugerir algo?

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s