Tutorial: Hacer una captura (screenshot) de un room en GameMaker Studio

By | 22 agosto, 2018

Esta es una continuación de mi tutorial anterior sobre cómo pausar el juego en GameMaker Studio. Aquí voy a mostrar cómo hacer una captura o screenshot de un room para usarla adentro del room de Pausa que hicimos en el tutorial, de tal modo que se pueda ver como un fondo detrás del texto.

Pausa capturaEn este tutorial vamos a emplear una surface en donde se pueda almacenar la captura del room anterior.

¿Qué es una surface?

Una surface, es una región en la memoria de video de nuestro sistema, la cual se puede usar como un segundo plano para dibujar los objetos por medio del evento Draw (como si dibujáramos en la pantalla del juego). Sin embargo, para visualizar una surface en la pantalla, se tiene que llamar a una función en el evento Draw, la cual explicaré más abajo.

Funciones básicas de surfaces que veremos en el tutorial

1. surface_create(ancho, alto)

Esta función nos permite crear una surface con las dimensiones que queramos. Para usar esta surface, la tenemos que almacenar en una variable utilizando el valor devuelto.

2. surface_copy(surf1, x, y, surf2)

Con esta función, podemos copiar el contenido de una surface existente a otra (de surf2 a surf1) a partir de la posición x,y dada.

3. draw_surface(surf)

Esta función nos permite dibujar una surface previamente creada con surface_create() a la pantalla del juego. Debe colocarse en el evento Draw de un objeto.

Paso 1: Crear la variable

Empezando con el tutorial, lo primero que vamos a hacer es abrir el objeto de «control_pausa» para crear una variable más en el evento Create. La llamaremos surface_room y le asignamos -1 como un valor temporal:

surface_room = -1;

Paso 2: Modificar el código de Pausa

En el evento que teníamos para ir al room de la Pausa (en mi caso, Key PressEnter) tenemos que cambiar el código para agregar las funciones y las variables que se encargan de crear la surface con la captura del room anterior. El código completo (y comentado) es el siguiente:

// Variables temporales
var tamano_w, tamano_h;

if (room != room_pausa)
{  // Tamaño de la surface (por defecto, será del mismo tamaño del room
   tamano_w = room_width;
   tamano_h = room_height;

   surface_room = surface_create(tamano_w, tamano_h);

   // Copiamos la escena actual del room a la surface
   surface_copy(surface_room, 0, 0, application_surface);

   // Luego indicamos la surface donde vamos a dibujar
   surface_set_target(surface_room);

   // Y por último se dibuja un fondo negro ligeramente transparente sobre la misma
   draw_set_alpha(0.5);
   draw_set_color(c_black);
   draw_rectangle(0, 0, tamano_w, tamano_h, false);
   draw_set_alpha(1.0);

   // Cuando finalicemos, debemos reajustar todo para que los objetos se dibujen
   // normalmente a la pantalla del juego
   surface_reset_target();


   // Se habilita el "persistent" en el room antes de ir a la pausa, para que todos
   // los objetos guarden su posición al regresar
   room_persistent = true;

   room_anterior = room;
   pausa = 1;
   room_goto(room_pausa);
}
else
{  if (surface_exists(surface_room))
   {  surface_free(surface_room);
   }

   // Si ya estabamos en la pausa, regresar al room anterior
   pausa = 0;
   room_goto(room_anterior);
}

Paso 3: Actualizar el evento «Draw»

Por último, solo tenemos que actualizar el código del evento Draw para dibujar la surface que contiene la captura del room mientras estemos en el room de Pausa. El código completo es el siguiente:

if (room == room_pausa)
{  if (surface_exists(surface_room))
   {  draw_surface(surface_room, 0, 0);
   }

   // Aquí empieza el código que ya teníamos en el evento
   draw_set_font(fuente_pausa);
   draw_set_color(c_white);
   draw_set_halign(fa_center);
   draw_text(room_width / 2, 100, "PAUSA");
   draw_text(room_width / 2, 150, "Pulsa el botón para regresar");
}

Solamente las primeras 4 líneas se han actualizado, ya que el resto del código es el mismo que ya teníamos en el evento.

Final

Si probamos el juego después de hacer estos cambios, vamos a notar que al pulsar el botón para pausar, se mostrará la escena del room anterior en el fondo, justo como se ve en la imagen que está al principio de esta publicación.

Para descargar el archivo editable con el código actualizado, puedes pulsar este link:

Archivo editable para GameMaker 8 y GameMaker: Studio

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *