Agosto 19, 2017, 08:33:51 AM Ultima modificación: Agosto 19, 2017, 09:28:13 AM por Naitsabes0
Bueno técnicamente tengo 4 finales en el juego que estoy creando  :D, pero hay un problema con estos que los hace ver muy mal, hasta el punto de resultar molesto a la vista en vez de ser satisfactorio, el problema es que el personaje del jugador sigue presente en la "room" donde salen los créditos del juego (final), esto se debe a que es un objeto persistente, ademas que trae consigo la interfaz gráfica, por lo que se ven los objetos y hasta la vida del jugador en pantalla   :-\, no puedo eliminarlo, ya que de hacerlo se activa el "GAME OVER" , por lo tanto mi pregunta seria.

¿Como debería armar un código para que el jugador deje de ser persistente cuando vaya a una "room" especifica?

Aquí dejo un GIF que muestra como el personaje se pasea de lo mas normal por los créditos del juego sin desaparecer, ademas que su interfaz también molesta a la vista como he mencionado con anterioridad.

Gracias por leer  :).

Podrías hacerlo invisible:

if (room == nombre_room)
{ visible = false; }


Esto hará invisible al sprite del objeto y a las funciones Draw que tenga en su evento Draw.

Por otro lado si tienes interés de desactivar la caraterística de Persisten usa:
if (room == nombre_room_antes_del_final) // si el personaje está en la room previa al final
{ persistent = false; }

Cita de: Zapdos43 en Agosto 19, 2017, 11:09:33 AM
Podrías hacerlo invisible:

if (room == nombre_room)
{ visible = false; }


Esto hará invisible al sprite del objeto y a las funciones Draw que tenga en su evento Draw.

Por otro lado si tienes interés de desactivar la caraterística de Persisten usa:
if (room == nombre_room_antes_del_final) // si el personaje está en la room previa al final
{ persistent = false; }

Si aplico su primer código el jugador muere al entrar y activa el game over, asiendo que la pantalla se ponga negra, en pocas palabras este código mata al objeto jugador cuando entre en la rom_final
if (room == rom_final)
{ visible = false; }

El otro código hace que el jugador muera cuando abandone la habitación seleccionada, aunque lo aga antes de entrar al final, este también activa el Game over, por lo que en ambos casos la pantalla se volverá negra, ya que el objeto esta muerto cuando hace la transición a otra room
if (room == nombre_room_antes_del_final) // si el personaje está en la room previa al final
{ persistent = false; }

Aquí se puede apreciar como el jugador muere cuando abandona la habitación, ya que perdió su función persistente al entrar en ella, en el otro caso muere de forma instantánea cuando entra, por lo que tengo 2 conclusiones.

1.- En la primera muere al entrar.
2.- En la segunda muere al salir.

Pero al menos se ve que el jugador si desaparece  :), solo que no debe estar muerto  :D.

#3 Agosto 19, 2017, 01:33:44 PM Ultima modificación: Agosto 19, 2017, 02:25:17 PM por Zapdos43
Entonces, hacerlo invisible tiene el incoveniente de activar el game over en la room final. Podrías activar el game over solo cuando el personaje está visible.
Sería algo así:
if (visible) // si el personaje es visible entonces comprobar el game over
{
// código del game over
}


Otra manera de hacer "invisible" al personaje es mandarlo fuera de la pantalla:
evento step:
if (room == room_final)
{
x = 2000;
y = 0;
}


Luego desactivamos el HUD en el evento draw con la siguiente condición:

if (room != room_final) // si la room no es la room final entonces dibujamos el HUD
{
// todo el código para dibujar el GUI
}

Cita de: Zapdos43 en Agosto 19, 2017, 01:33:44 PM
Entonces, hacerlo invisible tiene el incoveniente de activar el game over en la room final. Podrías activar el game over solo cuando el personaje está visible.
Sería algo así:
if (visible) // si el personaje es visible entonces comprobar el game over
{
// código del game over
}


Otra manera de hacer "invisible" al personaje es mandarlo fuera de la pantalla:
evento step:
if (room == room_final)
{
x = 2000;
y = 0;
}


Luego desactivamos el HUD en el evento draw con la siguiente condición:

if (room != room_final) // si la room no es la room final entonces dibujamos el HUD
{
// todo el código para dibujar el GUI
}

Creo que el mayor problema para hacer posible esto radica en que el código de game over es demasiado engorroso, para ser preciso están todos estos factores involucrados.

El objJugador tiene 8 actions en el draw GUI.


/// Vida Red Heart
if global. vida = 12
{
    draw_sprite(spr_HUD_Vida_Red_Heart,0,80,16)
}
if global. vida = 11
{
    draw_sprite(spr_HUD_Vida_Red_Heart,1,80,16)
}
...........................se repite esta secuencia hasta llegar a
if global. vida >= 0
{
    global.perdido = 0
}
if global. vida <= 0
{
    global. vida_npc = 0
    effect_create_above (ef_explosion,x,y,0,c_purple);
    audio_play_sound (snd_Risa_Malvada,50,false);
    instance_deactivate_object(obj_Bola_Orbital_Triple);
    instance_deactivate_object(obj_Bola_Orbital_Estrella);
    instance_deactivate_object(obj_Escudo_Protector);
    instance_deactivate_object(obj_Tiempo);
    instance_deactivate_object(obj_NPC_Espectador_amigo);
    instance_deactivate_object(obj_NPC_Cazador_amigo);
    instance_deactivate_object(obj_NPC_Caminante_amigo);
    instance_deactivate_object(obj_NPC_Caminante_Amigo_Plataforma);
    instance_deactivate_object(obj_NPC_Merodeador_amigo);
    instance_deactivate_object(obj_NPC_Centinela_amigo);
    instance_deactivate_object(obj_NPC_Infernal_amigo);
    instance_destroy()
}

/// Llaves jefe
if global.llaves_jefe = 6
{
    draw_sprite(spr_HUD_LlaveNegra_Jefe,6,0,344)
}
if global.llaves_jefe = 5
{
    draw_sprite(spr_HUD_LlaveNegra_Jefe,5,0,344)
}
..............la secuencia se repite hasta llegar a
if global.llaves_jefe = 0
{
    draw_sprite(spr_HUD_LlaveNegra_Jefe,0,0,344)
}
En las otras "actions" el proceso es el mismo

en el obj_Controlador hay esto //alarma 0 esta comentado


/// Inicializacion
display_set_gui_size(384,384);
global.zona = "";
global.perdido = -1;

alarm[0] = 1; // dar un fotograma de prevención antes de cargar
imagen_random=choose(0,1,2,3,4,5,6);
texto_random1=choose("Te han roto el corazon... ","Te han hecho pedazos... ","Te han eliminado... ","Te han destruido... ","Te han matado... ");
texto_random2=choose("Pulsa P para volver el tiempo atras","Pulsa P para regresar","Pulsa P para volver a intentarlo","Pulsa P para reiniciar","Pulsa P para otro intento");
globalvar dificultad_oscuro,dificultad_normal,dificultad_furioso;
dificultad_normal=12;
dificultad_furioso=6;
dificultad_oscuro=1;

Draw GUI
///GAME OVER Visible
if  (global.perdido >= 0) {
    image_alpha = 1;
    }

/// Dibujar el HUD
// Dibujar nombre de la zona
draw_set_color(c_white);
draw_set_font(f_Texto);
draw_set_halign(fa_right);
draw_text(view_wview-8,view_hview-22,string_upper(global.zona));

// Dibujar has perdido poco a poco
if  (global.perdido >= 0) {
    randomize();
    global.perdido = clamp(global.perdido+0.005,0,1);
    draw_set_alpha(global.perdido);
    draw_set_color(c_black);
    draw_rectangle(0,0,view_wview,view_hview+50,false);
    draw_sprite(spr_Perdido,imagen_random,view_wview/3,175); //draw_sprite(spr_Perdido,0,view_wview/2,175);
    draw_set_color(c_white);
    draw_set_font(f_Texto);
    draw_set_halign(fa_center);
    draw_text(view_wview/3,175,texto_random1);
    draw_text(view_wview/3,200,texto_random2);
    draw_set_alpha(1);
}

Como puede ver creo que este código es demasiado engorroso solo para sacar la ventana de GAME OVER cuando el jugador o NPC de apoyo se queda sin vida.

En evento Step del Jugador, en el primer Execute code coloca arriba del código:

[gml]
// hacer invisible al jugador cuando entre a la room final
if (room == room_final)
{
visible = false;
}[/gml]

Luego en el evento Draw GUI del jugador, en el primer Execute code coloca arriba del código:
[gml]// no seguir leyendo el código cuando visible es false
if (!visible)
{
exit;
}[/gml]

Repite este último paso para el evento Draw GUI del objeto controlador.

Cita de: Zapdos43 en Agosto 20, 2017, 11:32:19 AM
En evento Step del Jugador, en el primer Execute code coloca arriba del código:

[gml]
// hacer invisible al jugador cuando entre a la room final
if (room == room_final)
{
visible = false;
}[/gml]

Luego en el evento Draw GUI del jugador, en el primer Execute code coloca arriba del código:
[gml]// no seguir leyendo el código cuando visible es false
if (!visible)
{
exit;
}[/gml]

Repite este último paso para el evento Draw GUI del objeto controlador.
objJugador
STEP::::::::::::::::::::::
// hacer invisible al jugador cuando entre a la room final
if (room == room_final)
{
visible = false;
}
DRAW GUI::::::::::::::::::::::::::::::::::::
// no seguir leyendo el código cuando visible es false
if (!visible)
{
exit;
}

obj_Controlador
DRAW GUI:::::::::::::::::::::::::::::::::::
///GAME OVER Visible
// no seguir leyendo el código cuando visible es false
if (!visible)
{
exit;
}
if  (global.perdido >= 0) {
    image_alpha = 1;
    }

Se agradece el apoyo, pero creo que tendré que dejar este tema de lado, ya que encontré una solución poco practica, pero eficiente, la cual es comentar los códigos que activan el GAME OVER, de esa forma cuando el jugador muera no saldrá GAME OVER, pero tampoco saldrá cuando muera en el desarrollo del juego, algo es algo  :), como ya he gastado mucho tiempo en este problema, me he estado desempeñando en hacer un "power up" similar a la estrella de mario en este otro post http://www.comunidadgm.org/preguntas-y-respuestas/quiero-armar-de-la-forma-mas-eficiente-este'power-up'/