OpenLoad | Ver Paddington 2 film | Michelle Summers

Tutorial Crear imagen "congelada" de una room en GameMaker

OP

YoshiFanGM

Gimmick Master
Colaborador
Mensajes
1.055
Calificaciones
476 3
Puntos
160
Ubicación
MTY
#1
Holas, como dije en el tutorial pasado de cómo realizar una Pausa en Game Maker, aquí haré una continuación y explicaré cómo agregar una imagen congelada de una room para dibujarla mientras el juego esté pausado.

En este tutorial vamos a conocer un poco sobre las "surfaces" de Game Maker. Una surface es básicamente una región en la memoria de video que podemos usar como un "segundo plano" donde podemos dibujar tal y como lo haríamos en un evento Draw. La principal diferencia es que todo lo que dibujemos en una surface no se verá en el juego hasta que llamemos draw_surface(); dicha función servirá para dibujar una surface a la pantalla del juego.

Para descargar el ejemplo del tutorial pasado, pulsen este link:
Tutorial Pausa 2.zip [Google Drive]

Lo que vamos a lograr aquí, será poner una especie de "captura" en el room de pausa que hice en el tutorial pasado, que muestre la escena del room en la que estabamos anteriormente:



Empezando con el tutorial, tenemos que crear una variable donde almacenemos la surface de la room anterior. La podemos llamar "surface_room" y la colocamos en el evento Create del objeto que controla la pausa (en mi caso, control_pausa):

surface_room = -1;

Luego, en el evento de Key press <Enter> para mostrar la pausa, cambiamos el código para agregar las variables y las funciones que controlarán la creación de la surface con la imagen del room anterior.

Para GameMaker: Studio, el código es el siguiente:
PHP:
var tamano_w, tamano_h;

if (room != room_pausa)
{  // Tamaño de la surface
   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);
}

Para GameMaker 8.1 o anteriores:
PHP:
var tamano_w, tamano_h;

if (room != room_pausa)
{  // Tamaño de la surface
   tamano_w = room_width;
   tamano_h = room_height;

   surface_room = surface_create(tamano_w, tamano_h);

   // En GameMaker 8 y anteriores, para que la surface parezca una réplica casi
   // exacta del room anterior se tiene que dibujar el fondo y todos los
   // objetos manualmente.

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

   // Luego se dibuja el fondo (en mosaico) con draw_background_tiled
   draw_background_tiled(background_index[0], 0, 0);

   // Después se dibujan todos los objetos que tengan sprite
   with (all)
   {  if (sprite_index != -1)
      {  draw_self();
      }
   }

   // Y por último se dibuja un fondo negro ligeramente transparente sobre la misma
   // surface del room
   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);
}

Y en el evento Draw, para que se visualice la escena solamente agregamos la función para dibujar la surface, al principio de la condición:
PHP:
if (room == room_pausa)
{  if (surface_exists(surface_room))
   {  draw_surface(surface_room, 0, 0);
   }

   // Aquí empieza el código que teníamos en el objeto
   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");
}

Si probamos el juego y pulsamos el botón para pausar, notaremos que la imagen del room quedará grabada en el fondo de la pantalla, tal y como se ve en la captura que mostré al principio.

Descarga del ejemplo terminado:
Tutorial Pausa 3.zip [Google Drive]

Saludos.
 
Última edición:
OP

YoshiFanGM

Gimmick Master
Colaborador
Mensajes
1.055
Calificaciones
476 3
Puntos
160
Ubicación
MTY
#2
He puesto los links de los archivos editables terminados para ambas versiones de GameMaker. Al fin logré instalar y correr GameMaker: Studio con Wine, y puedo confirmar que el código para GMS funciona correctamente. No hubo necesidad de hacer cambios al código del tutorial smiling_face_with_open_mouth

Saludos.
 
Última edición: