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.
En 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 Press → Enter) 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: