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();
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?
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();
En serio, solo pon screen_redraw() antes del sleep en tu código original.
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...
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.
Cita de: penumbra en Febrero 26, 2014, 08:56:08 PM
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.
¿Pues por que no se me ejecuta si yo la tengo dentro de esta condición?:
if (instance_number(obj_Enemigo_A) == 0) and room == PLAYA
{
obj_heroe.x = 1024; obj_heroe.y = 832;
alarm[0] = 30 * 5;
}
Luego, en el evento Alarm 0, tengo puesto unas líneas de código. Pero jamás se me ejecutan...
Alarm 0:
sleep(3000);
sound_play(nuestrosonido);
instance_destroy();
CÓDIGO QUE FUNCIONA:Este código realiza de forma aproximada lo que quiero hacer. Pero me gustaría testearlo con alarmas. Es la función que me paso Killer:
if (instance_number(obj_Enemigo_A) == 0) and room == PLAYA
{
obj_heroe.x = 1024; obj_heroe.y = 832;
screen_redraw(); // función de Killer
sleep (3000);
sound_play(snd_abre_reja);
instance_destroy();
}
if (instance_number(obj_Enemigo_A) == 0) and room == PLAY
Step1:
El GM revisa el If y si es verdadero va ha realizar lo que esta dentro del bloque
Siguiente Step:
El GM revisa el If y si es verdadero va ha realizar lo que esta dentro del bloque
Siguiente Step:
El GM revisa el If y si es verdadero va ha realizar lo que esta dentro del bloque
Siguiente Step:
El GM revisa el if ....
Osea que lo que esta dentro del bloque:
{
obj_heroe.x = 1024; obj_heroe.y = 832;
alarm[0] = 30 * 5;
}
... si va ejecutar en todos los STEPs, mientras que la condicion del IF sea verdadera produciendo bug, por ejenplo que tu personaje no se pueda mover.
Yo en mi ejemplo agregue una nueva variable para que lo que esta dentro del bloque se realice solo la primera vez que el IF sea verdadero:
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 //volver esta variable a 0 evita que en el siguiente step se ejecute este bloque.
alarm[0] = 30;
}
3) Alarm[0]
sound_play(snd_abre_reja);
instance_destroy();
Pero reconozco que no es la forma mas "elegante" pero si para que comprendas que es lo que esta sucediendo.
Acabo de probar tú código pero no funciona, vampy. El personaje es transportado hacia la puerta, pero al moverse se paraliza. Pero los enemigos siguen su camino. De momento lo que ha funcionado es el código que he puesto subrayado mas arriba. Pero quiero entender bien este tema. De todas formas gracias por los aportes, eh...