Bienvenidos sean a este post, hoy haremos una pequeña pausa asi que espero les haya gustad… nah, era broma hoy agregaremos un menu de pausa y retoma del juego.
Para trabajar con el menu de pausa vamos a hacerlo de manera similar a lo visto en el post anterior, entonces lo primero que haremos sera crear un nuevo sprite al cual llamaremos spr_Retomar, lo haremos de un tamaño de 256 x 64, como los botones anteriores, tambien debemos hacerlo de dos frames para tener uno cuando esta elegido y otro para cuando no, les dejo un ejemplo de como lo hice

Nuestro siguiente paso sera crear el objeto para la pausa, lo llamaremos obj_Pausa, nuestra primera modificacion sera crear un evento de tipo Create al cual le agregaremos el siguiente bloque:
depth = -100;
var superficie_pausa = surface_create(
surface_get_width(application_surface),
surface_get_height(application_surface));
esta_pausado = false;
puede_proceder = false;
alarm[0] = 1;
eleccion = 0;
La primer linea setea el valor de la profundidad, es decir que lo vamos a tener cargado pero va a estar por debajo de nuestro nivel, la siguiente establecera el valor de la superficie para nuestra pausa, para el creara una nueva superficie y tomara la superficie que usa nuestra aplicacion o lo mismo que decir el tamaño de nuestro nivel o room, despues tendremos dos variables de tipo boolean que las setearemos como false y a estas la usaremos para pausar y proceder, por ultimo tenemos una alarma que espera un solo paso y otra vez la variable eleccion, va a tener un trabajo similar al post anterior, la siguiente modificacion sera agregar la alarma que establecimos en Create y dentro de esta agregaremos la siguiente linea:
puede_proceder = true;
Ya veremos porque esto pero mas adelante, la siguiente modificacion sera agregar un evento Step -> Step, una vez creado agregaremos el siguiente codigo:
if (keyboard_check_pressed(ord("P")) && puede_proceder)
instance_destroy();
Este condicional verifica si puede_proceder es true y presionamos la tecla P, esto equivale a que puede proceder con la pausa y para ello destruimos la instancia, nuestro siguiente paso sera agregar un evento Draw -> Draw, una vez creado agregaremos el siguiente codigo:
if (puede_proceder)
{
if (surface_exists(superficie_pausa))
{
draw_surface(superficie_pausa,0,0);
}
else
{
event_perform(ev_create,0);
}
if (!esta_pausado)
{
esta_pausado = true;
surface_set_target(superficie_pausa);
draw_surface(application_surface,0,0);
surface_reset_target();
instance_deactivate_all(true);
}
}
Primero chequeamos si puede_proceder esta con valor true, si esto es asi pasamos a ejecutar el bloque donde primero tendremos un condicional donde verifica si superficie_pausa existe como surface, en caso de ser veradero procede a dibujar con el valor de los ejes X e Y con los valores 0 y 0, de lo contrario si no existe procede a ejecutar nuevamente el evento Create por medio de event_perform donde primero pasaremos el evento, ev_create, y el segundo es un valor para un subevento de la misma, en este caso le pasamos el valor para que usarlo con el chequeo de teclado.
El siguiente paso sera verificar si esta_pausado esta con valor false, en caso de ser afirmativo procedemos a pasarlo a true, luego seteamos a superficie_pausa como nuestra superficie de destino, despues dibujamos nuestro superficie nuevamente con la seteada, luego la reseteamos para que pase a ser nuestra superficie de pausa y por ultimo desactivamos (no destruimos) todas las instancias y el parametro que pasamos como true somos nosotros, es decir notme, pero que pasaria si pasamos un false, se desactivaria todas las instancias incluidas la de pausa y se freezaria el juego y nosotros no queremos eso, verdad? Esto ultimo hace que se detengan todas las actividades de nuestro juego, evitando que se sigan actualizando y dibujando en pantalla.
Con todo esto solo nos falta un par de pasos mas, en este caso debemos agregar el menu de pausa y para ello agregaremos en el evento Draw y dentro del condicional que verifica el estado de puede_proceder pero despues del bloque agregado recientemente el siguiente codigo:
draw_set_alpha(0.75);
draw_roundrect_color(0,0,
room_width-1,
room_height-1,
c_gray,
c_white,
false);
if (keyboard_check_pressed(vk_up))
{
eleccion = 0;
}
else if (keyboard_check_pressed(vk_down))
{
eleccion = 1;
}
El primer paso sera setear un alpha para nuestro objeto de 0.75, es decir que sera un poco transparente, luego crearemos un rectangulo pero con las puntas redondeadas por medio de draw_roundrect_color, los dos primeros parametros son el valor inicial del eje X e Y respectivamente, luego pasaremos hasta cuales tiene que cubrir y para esto usaremos el ancho del nivel y el alto del nivel y ambos les restaremos 1 para que no se pasen del mismo, el primer color es para el centro y el otro para el borde, prueben con otras combinaciones, y el ultimo es para llenar o no al rectangulo, si usamos true lo deja vacio y con false lo completa con el color del centro, despues tenemos un condicional similar a cuando vimos el menu de inicio, donde verifica si presionamos arriba o abajo y modifica eleccion dependiendo cual elegimos, con esto comentado agreguemos el siguiente bloque despues de este condicional y dentro del principal:
switch(eleccion)
{
case 0:
draw_sprite(spr_Retomar,0,128,352);
draw_sprite(spr_Salir,1,128,422);
break;
case 1:
draw_sprite(spr_Retomar,1,128,352);
draw_sprite(spr_Salir,0,128,422);
break;
}
Este switch hace exactamente lo mismo que en el post anterior, en base al valor de eleccion muestra los sprites que le pedimos pero en lugar de mostrar el de Jugar o iniciar nos muestra el de volver de la pausa o retomar y el que usabamos de salida, nuestra siguiente modificacion sera agregar este bloque despues del anterior:
if (keyboard_check(vk_enter))
{
switch(eleccion)
{
case 0:
instance_destroy();
break;
case 1:
room_goto(rm_setup);
break;
}
}
Este condicional verifica si presionamos Enter pero en lugar de usar a keyboard_check_pressed utilizamos a keyboard_check donde verifica si fue esa tecla no si la presionamos, en este caso usaremos el switch para verificar a eleccion, en el caso de 0 (es decir que volvemos al juego) procede a destruir la instancia y volver al juego y la segunda sera para salir de este volviendo al menu de inicio, con esto realizado debemos agregar un nuevo evento, antes veamos como quedo el codigo de este evento:
/// @description Insert description here
// You can write your code in this editor
if (puede_proceder)
{
if (surface_exists(superficie_pausa))
{
draw_surface(superficie_pausa,0,0);
}
else
{
event_perform(ev_create,0);
}
if (!esta_pausado)
{
esta_pausado = true;
surface_set_target(superficie_pausa);
draw_surface(application_surface,0,0);
surface_reset_target();
instance_deactivate_all(true);
}
draw_set_alpha(0.75);
draw_roundrect_color(0,0,
room_width-1,
room_height-1,
c_gray,
c_white,
false);
if (keyboard_check_pressed(vk_up))
{
eleccion = 0;
}
else if (keyboard_check_pressed(vk_down))
{
eleccion = 1;
}
switch(eleccion)
{
case 0:
draw_sprite(spr_Retomar,0,128,352);
draw_sprite(spr_Salir,1,128,422);
break;
case 1:
draw_sprite(spr_Retomar,1,128,352);
draw_sprite(spr_Salir,0,128,422);
break;
}
if (keyboard_check(vk_enter))
{
switch(eleccion)
{
case 0:
instance_destroy();
break;
case 1:
room_goto(rm_setup);
break;
}
}
}
Nuestra siguiente modificacion sera tambien en el objeto de pausa, obj_Pausa, y agregaremos un nuevo evento llamado Destroy, este evento es lo contrario a Create porque se ejecutara cuando se destruye la instancia a diferencia del otro que lo hace al iniciar la instancia del objeto, una vez creado agregaremos las siguientes lineas:
instance_activate_all();
surface_free(superficie_pausa);
La primera linea se encarga de volver a activar todas las instancias de nuestro, recuerden que los desactivamos cuando dibujamos al objeto, y la siguiente se encarga de quitar de memoria a dicho objeto porque ya no es necesario y esto es una buena practica especialmente con objetos mas grandes, con esto ya tenemos nuestro objeto para la pausa terminado, nuestro siguiente modificacion sera en el objeto del jugador.
Volvemos a nuestro objeto del jugador y debemos agregar un par de modificaciones, la primera sera en el evento Step, en el switch encargado de monitear las teclas que presionamos agregaremos el siguiente case:
case ord("P"):
instance_create_depth(0,0,0,obj_Pausa);
break;
En este case monitoreamos si presionamos la tecla P y en caso de ser cierto creamos la instancia del objeto creado anteriormente, tan simple como eso, veamos como quedo el switch:
switch(keyboard_key)
{
case vk_left:
hspeed = -4;
image_index = 0;
break;
case vk_right:
hspeed = 4;
image_index = 1;
break;
case ord("P"):
instance_create_depth(0,0,0,obj_Pausa);
break;
default:
hspeed = 0;
image_index = 2;
break;
}
Y nuestra ultima modificacion sera tambien en obj_Pepe al cual le agregaremos un nuevo evento Draw -> Draw, una vez creado agregaremos estas dos lineas:
draw_self();
draw_text(400,0,"P para Pausa")
La primera sera para poder dibujar el sprite de nuestro objeto y tambien un texto, el texto sera «dibujado» por medio de la siguiente linea, en este caso establecemos que el texto ira en la parte superior derecha y el texto que mostraremos sera para indicar con cual pausamos, pueden variar el texto pero seguramente deberan modificar el valor del eje X, con todas estas modificaciones realizadas podemos pasar a compilar y probarlo para ver como funciona mediante el siguiente video
Ahora si podemos decir que tenemos un gran juego mas completo donde no solamente tenemos un inicio sino que tambien podremos pausarlo, y desde ahi volver al juego o volver al menu de inicio, por lo tanto ahora no tienen excusa para pausarlo cuando nuestras madres nos llamen a comer xD
En resumen, hoy hemos visto como agregar un menu de pausa, hemos creado todos los elementos necesarios, tambien hemos agregado todos los eventos necesarios para poder generar dicha pausa, hemos trabajado con la posibilidad de poder desactivar y volver a reactivar las instancias, tambien hemos visto como trabajan las superficies (surfaces) de nuestro room o nivel, por ultimo hemos visto las modificaciones en el objeto del jugador para disparar todos los eventos de la pausa, espero les haya gustado sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donación
Es para mantenimento del sitio, gracias!
$1.00
