Bueno, supongo que no. Pero explicaré lo que me ocurre.

Cuando creamos una condición del tipo IF, el bloque que creamos entre corchetes se ejecuta de forma secuencial. Osea, una instrucción detrás de la otra. Pues con este código me va al revés:

if (instance_number(obj_Enemigo_A) == 0) and room == PLAYA
{
    //sound_play(snd_abre_reja);
   
    obj_heroe.x = 1024; obj_heroe.y = 832;
    sleep(5000);
    instance_destroy();
}


El código está en el objeto puerta. En su evento Step. Cuando en la room no quedan enemigos, una puerta que estaba cerrada se abre. El jugador es transportado al lado de esa puerta para que nos haga ver que se ha abierto.

Pero quiero que el jugador llegue a ese lugar, y aún veamos esa puerta cerrada. Creía que con el sleep resultaría así. Pero no.

Ocurre esto:

En el sitio que estamos, se produce la parada del sleep (5 segundos) y luego nos transporta al lado de la puerta. Pero ya está abierta. Cosa que no entiendo.

¿No debería transportarnos primero, luego la parada del sleep y después que se abra la puerta? Pregunto...

Nunca he usado sleep, pero no creo que funcione como intentas. No hay manera de que el sleep sepa que quieres "detener" solamente la apertura de la puerta. el sleep detiene TODO el juego, o eso creo, no importa dese qué instancia lo llames.

Lo que debes hacer es mover al personaje primero, y luego hacer que la puerta se abra, cosa que sucede al revés. Por ejemplo, ya sé que es un bloque y que todo se ejecuta cuando la condición se cumple, pero siendo estrictos, ahí estás reproduciendo el sonido de la puerta antes de mover al jugador, y sería más lógico mover al jugador y hasta después abrir la puerta y reproducir el sonido. Ayudaría que pusieras el código con el que se abre la puerta y mencionaras exactamente en qué momento lo llamas.

Pon screen_redraw() antes del sleep para dibujar el estado actual del juego antes de la espera.

Cita de: penumbra en Febrero 24, 2014, 09:14:10 PM
Nunca he usado sleep, pero no creo que funcione como intentas. No hay manera de que el sleep sepa que quieres "detener" solamente la apertura de la puerta. el sleep detiene TODO el juego, o eso creo, no importa dese qué instancia lo llames.

Lo que debes hacer es mover al personaje primero, y luego hacer que la puerta se abra, cosa que sucede al revés. Por ejemplo, ya sé que es un bloque y que todo se ejecuta cuando la condición se cumple, pero siendo estrictos, ahí estás reproduciendo el sonido de la puerta antes de mover al jugador, y sería más lógico mover al jugador y hasta después abrir la puerta y reproducir el sonido. Ayudaría que pusieras el código con el que se abre la puerta y mencionaras exactamente en qué momento lo llamas.

No, si no hay mas código que ese. Un simple instance_destroy() de la puerta. De todas formas, según mi código, primero muevo el personaje. Porque esta primero que el instance_destroy().

Ahora lo he modificado a:

{
   
   
    obj_heroe.x = 1024; obj_heroe.y = 832;
    sound_play(snd_abre_reja);
    instance_destroy();
}


Pero pasa todo tan rápido que cuando llega el personaje y se reproduce el sonido, la puerta ya se ha destruido.

Todo el código está en el objeto puerta. Probé ponerlo en el objeto jugador, pero se bloqueaba. Se quedaba inmóvil nuestro personaje.

Cita de: Jangse en Febrero 24, 2014, 09:35:50 PM
No, si no hay mas código que ese. Un simple instance_destroy() de la puerta. De todas formas, según mi código, primero muevo el personaje. Porque esta primero que el instance_destroy().

Ahí está el detalle. Cuando mueves al personaje, la puerta se destruye, todo en el mismo STEP (En términos prácticos, si tu velocidad de habitación es de 30, mover al personaje, abrir la puerta y destruir la puerta ocurre en 3 centésimas de segundo).

Yo usaría un objeto puerta, con dos subimágenes. Una de la puerta cerrada y otra de la puerta abierta. Cuando ya no hubiera enemigos, cambiaría la subimagen a la de la puerta abierta y arrancaría una alarma a 1 o dos segundos. En el evento de la alarma pondría instance_destroy(). Así daría tiempo de ver que la puerta está abierta y después de unos segundos de mostrar la imagen de la puerta abierta, la instancia se destuiría.

Y con una alarma:

{
    obj_heroe.x = 1024; obj_heroe.y = 83;
     alarm[0] = 30; // cambia el 30 por la cantidad de steps que tu desees
   
}

Alarm[0]

sound_play(snd_abre_reja);
instance_destroy();
The next best thing to knowing something,
is knowing where to find it.

#6 Febrero 25, 2014, 09:42:02 PM Ultima modificación: Febrero 25, 2014, 09:43:56 PM por Jangse
Lamento ser tan pesado, pero de momento no me funciona con vuestros códigos.

Me explico:

OBJETO PUERTA

Evento ALARM 0

sound_play(snd_abre_reja);
instance_destroy();


Evento STEP

if (instance_number(obj_Enemigo_A) == 0) and room == PLAYA
{
    alarm[0] = 30*10;
}


He quitado la línea en STEP  obj_heroe.x = 1024; obj_heroe.y = 832; por que me pasaba algo raro. El personaje, cuando era transportado allí, se movía un solo pixel y ya ya no se podía mover mas.

Total, que parece que la alarma no me funciona. Ya que llego hasta allí, después de eliminar todos lo enemigos, pero pasados 10 segundos (30*10), la puerta sigue cerrada ¿Ahora que hago mal?


#7 Febrero 25, 2014, 10:15:29 PM Ultima modificación: Febrero 25, 2014, 10:19:49 PM por vampy09
1) Crea una nueva variable llamala global.level_finish = 0;
2) Evento Step

if (instance_number(obj_Enemigo_A) == 0) and room == PLAYA)
{
   global.level_finish = 1;
}

if ( global.level_finish = 1 )
{
    obj_heroe.x = 1024; obj_heroe.y = 832;
    global.level_ finish = 0
    alarm[0] = 30;
}

3) Alarm[0]
sound_play(snd_abre_reja);
instance_destroy();
The next best thing to knowing something,
is knowing where to find it.

En serio, solo pon screen_redraw() antes del sleep en tu código original.

#9 Febrero 26, 2014, 01:28:42 AM Ultima modificación: Febrero 26, 2014, 01:31:35 AM por vampy09
Jangse ya has tratado con lo Killer ha escrito ?
Cita de: Killer en Febrero 25, 2014, 11:21:50 PM
En serio, solo pon screen_redraw() antes del sleep en tu código original.


Dado que ...

Cita de: vampy09 en Febrero 25, 2014, 10:15:29 PM
1) Crea una nueva variable llamala global.level_finish = 0;
2) Evento Step

if (instance_number(obj_Enemigo_A) == 0) and room == PLAYA)
{
   global.level_finish = 1;
}

if ( global.level_finish = 1 )
{
    obj_heroe.x = 1024; obj_heroe.y = 832;
    global.level_ finish = 0
    alarm[0] = 30;
}

3) Alarm[0]
sound_play(snd_abre_reja);
instance_destroy();

... podria funcionar; pero creo que no es la mejor respuesta.
Otra forma  seria creando un objeto llave...
The next best thing to knowing something,
is knowing where to find it.

y si haces que la puerta se abra dentro de ese mismo código luego ?

tienes que espera a que el sonido se detenga para que despues destruir la puerta

if !sound_isplaying(snd_abre_reja) instance_destroy();

Cita de: gortz en Febrero 26, 2014, 08:21:51 AM
tienes que espera a que el sonido se detenga para que despues destruir la puerta

if !sound_isplaying(snd_abre_reja) instance_destroy();

Quería hacer el código mediante alarmas. Y esa función que has puesto, la he mirado en manual pero no le pillo mucho como trabaja.

La duda es si siempre hay que poner un evento CREATE cuando se crea una alarma. Por que si hago una llamada desde un STEP a la alarma, esta no se ejecuta. Y desde un CREATE, sí.

La alarma se puede poner en CREATE o STEP o DRAW, KEY PRESS, etc, etc.. El detalle es tener en consideración cómo trabaja el evento.

Cita de: Jangse en Febrero 26, 2014, 08:51:20 PM
Por que si hago una llamada desde un STEP a la alarma, esta no se ejecuta. Y desde un CREATE, sí.

LA alarma siempre se ejecuta, pero mira que el código en STEP se está ejecutando recurrentemente, paso a paso, la alarma en STEP  apenas comienza a andar cuando al siguiente paso la reajustas de nuevo a su valor inicial: nunca se permite que "corra de principio a fin"

Por eso si usas alarmas en STEP deben de ir dentro de alguna condición, para que el STEP no las "arranque" paso a paso.

Cita de: Killer en Febrero 25, 2014, 11:21:50 PM
En serio, solo pon screen_redraw() antes del sleep en tu código original.

Eso a funcionado a la primera. Dude en hacerlo antes. Por que hace tiempo tenía un problema con otro código y me recomendaron no usar esta función nunca. Cosa que no entendí, pero bueno...

Mas o menos, decían, que esta función consumía muchos recursos por que debía dibujar la pantalla entera de nuevo. Y podía hacer lag en el juego.