Hola GAMEMAKEROS !!
¿Como se podria hacer un popup con ciertos botones y que tenga un boton cerrar, para volver al juego?
Algo parecido a lo que hay en el Candy Crush, os dejo una foto para que veais a lo que me refiero.
(http://www.subeimagenes.com/img/vidas-candy-crush-pepper-panic-saga-1650546.jpg)
Al presionar algun boton se crearia un nuevo objeto que seria el popup.
Para este nuevo objeto tendrias que editar la mascar de colision del sprite para que solo sea del tamaño del boton de cerrar.
Luego en el evento Mouse -> Left press pone que se destruya el objeto y listo.
Pero que el objeto tenga botones (no solo el de cerrar) y sea interactivo?
Para eso tendrias que definir areas en el objeto.
Se tiene un sprite de un tamaño de 60 de ancho por 100 de alto, al presionar el boton del raton se verifica la posicion del raton, para esto se tendria en cuenta 4 valores.
Para el boton de cerrar que tendria un tamaño de 20x20 (siendo el origen x=0, y=0) en el sprite seria x1=40, x2=60, y1=0 e y2=20 (este codigo de ejemplo: if mouse_x>x+40 and mouse_x<x+60)
Conociendo eso si el puntero se encuentra entre esos valores en este caso el objeto se destruye.
Si no quedo muy claro te hago un ejemplo.
Creo que no se me entiende o no me explico bien...
Lo que quiero mostrar es una imagen (con posibilidad de cerrarse desde la X), la pregunta es ¿como muestro dicha imagen sin que afecte a lo demás o bien que el resto del juego quede en pausa?
Creo que ahora me explicado mejor que al principio. XD
Hay varias soluciones, entre ellas hay dos que se usan comunmente:
La primera es usar una variable de estado, que puede ser global o pertenecer a las instancias. La variable se revisa en cada Step para saber si la instancia debe ejecutar código. Ejemplo:
[gml]
//Evento Step
if( global.pausa )
{
image_speed = 0;
exit;
}
[/gml]
La segunda es tomar una captura de la pantalla, en un archivo o en una surface, y después desactvar las instancias. La captura se muestra como fondo. Ejemplo:
Se crea el objeto pausa con el siguiente código
[gml]
//Evento Create
visible = false; //la variable visible se usa como el estado de pausa
sf_pausa = surface_create( room_width, room_height );
[/gml]
si se usa una vista más pequeña que la room, la surface se debe hacer igual al tamaño de la vista.
[gml]
//Evento Key Press
if( not visible ) //pausar
{
if( not surface_exists(sf_pausa) )
sf = surface_create( room_width, room_height );
surface_copy( sf_pausa, 0,0, application_surface );
instance_deactivate_all( true );
visible = true;
}
else //quitar pausa
{
instance_activate_all();
visible = false;
}
[/gml]
[gml]
//Evento Draw
if surface_exists( sf_pausa )
draw_surface_ext( sf_pausa, 0,0,1,1,0, c_gray,1 );
draw_self();
[/gml]
El inconveniente con este sistema es que la surface se puede borrar de forma inesperada, por la forma en que se almacenan las surfaces, pero es poco probable. Una alternativa es guardar la application_surface como un archivo, pero eso requiere un poco más de memoria.