Buenas amigos, pues otra vez ando por aqui.
Como ya os comente en otro tema, consegui hacer funcionar el surfaces, pero uno de los requisitos para que funcionase, era que el objecto que controla el surfaces (obj_control) estuviera en la lista de objectos cargados por la room en el ultimo lugar de prioridad. (adjunto foto)
Vale, todo funciona perfecto asi, HASTA QUE!!!
Se crea un nuevo objecto con LUZ. Entonces, este pasa a ser el ultimo de la lista de y claro, ya no lo es el objecto que controla la surfaces y entonces se produce error.
La pregunta es. Se puede controlar mediante codigo??? La posicion o prioridad del objecto en la lista de instance order de la Room???
Hay una funcion para esto?? porque yo la desconozco.
Bueno si alguien sabe algo que me comente. Thank You!!!! ;)
Que yo sepa no hay forma de hacerlo a código, peeeeero, puede que puedas arreglarlo usando los eventos "Begin Step" y "End Step" o "Draw Begin" y "Draw End".
No creo, porque el obj_control tiene que tener todos los objectos ya creados cuando este aplique el surface sobre ellos.
Creo que no hay otra. Tengo que tener siempre este objecto el ultimo. ???
Cita de: Seirlord_Games en Agosto 29, 2017, 11:58:45 AM
Que yo sepa no hay forma de hacerlo a código, peeeeero, puede que puedas arreglarlo usando los eventos "Begin Step" y "End Step" o "Draw Begin" y "Draw End".
El orden de los eventos Draw se puede controlar con la variable depth.
Para controlar el orden de otros eventos se puede crear una lista con los ids de las instancias. Usa una variable global para salir de los eventos en la ejecución normal. Uno objeto controlador ejecutará los objetos en orden usando with y la función event_perform.
Tal cual, podes manejar la variable depth para la profundidad de las instancias.
Link util:
https://docs.yoyogames.com/source/dadiospice/002_reference/objects%20and%20instances/instances/instance%20properties/depth.html
Muchas gracias por responder clamud.
Efectivamente, conozco que el orden se crea a partir del depth, por eso cuando arranco la room todo funciona bien, porque el objecto que controla la surfaces tiene un depth de -1000.
El problema surge cuando a mitad de la partida, con todas las instancias creadas, se crea un nuevo objecto y al parecer, da igual la profundidad que tenga, que este, se posiciona el ultimo y por lo tanto deja de funcionar el objecto que controla el surfaces.
Lo que comentas de usar una variable global y un event perform no lo entiendo muy bien. Esto me ayudaria a posicionar el nuevo objecto creado en la ultima posicion del instance order?? ???
Cita de: Clamud en Agosto 29, 2017, 01:28:52 PM
El orden de los eventos Draw se puede controlar con la variable depth.
Para controlar el orden de otros eventos se puede crear una lista con los ids de las instancias. Usa una variable global para salir de los eventos en la ejecución normal. Uno objeto controlador ejecutará los objetos en orden usando with y la función event_perform.
Crea una variable global, por ejemplo global.dibujar_luz = false;
En el evento que dibuja la luz coloca el bloque DnD "Test variable", como aparece en la imagen adjunta, para ejecutar el código solo cuando la variable sea true.
En el objeto que se dibuja al último activa la variable global y ejecuta el evento de los objetos luz
[gml]
global.dibujar_luz = true;
with( obj_luz )event_perform(ev_step, ev_step_normal);
global.dibujar_luz = false;
[/gml]
Otra forma sería simplemente no poner código en los objetos que generan luz y poner todo el código en el objeto controlador
[gml]
with( obj_luz ){
//codigo para generar luz
}
[/gml]
No podrías hacer que cuando se crea el objeto luz se cree otra instancia del controlador y se elimine la que tenias antes? Asi quedaria a lo ultimo... Lo unico que no se es si te daria error en el intervalo, es que nunca trabaje con surfaces :-[
:GMS:
Gracias clamud por tu teoria.
Pero no se si funcionara. Tendre que probarlo. Pero creo que se escapa algo. Porque en el transurso en el que la variable este en false. La room que esta en plena oscuridad se encenderia al no tener activado el objecto que controla el surfaces.
O por lo menos eso creo que ocurriria. Tendre que probarlo.
Cita de: Clamud en Agosto 30, 2017, 03:15:29 AM
Crea una variable global, por ejemplo global.dibujar_luz = false;
En el evento que dibuja la luz coloca el bloque DnD "Test variable", como aparece en la imagen adjunta, para ejecutar el código solo cuando la variable sea true.
En el objeto que se dibuja al último activa la variable global y ejecuta el evento de los objetos luz
[gml]
global.dibujar_luz = true;
with( obj_luz )event_perform(ev_step, ev_step_normal);
global.dibujar_luz = false;
[/gml]
Otra forma sería simplemente no poner código en los objetos que generan luz y poner todo el código en el objeto controlador
[gml]
with( obj_luz ){
//codigo para generar luz
}
[/gml]
Pregunta, estas manejando la profundidad de todas las instancias que tenes en la room? O solo la de las luces?
Para que la profundidad de las instancias funcione correctamente, deberias tener la variable depth seteada correctamente en el create de cada instancia. Si no, no te las va a ordenar.
Por ejemplo, si tenes un obj_pared, este tiene q tener un depth tmb.
David muchas gracias. Esto que dices no suena mal. Pero creo que ocurriria lo mismo que clamud.
En el intervalo entre que se borra el objecto controlador hasta que se crea otra vez. La oscuridad de la habitacion desapareceria aunque solo sea un segundo y habria un destello.
O por lo menos eso creo. Habria que probarlo tambien.
Cita de: DavidTheAnswerer en Agosto 30, 2017, 03:21:32 AM
No podrías hacer que cuando se crea el objeto luz se cree otra instancia del controlador y se elimine la que tenias antes? Asi quedaria a lo ultimo... Lo unico que no se es si te daria error en el intervalo, es que nunca trabaje con surfaces :-[
:GMS:
Gracias por responder bocha.
Pues si que estoy dandole un orden al depth de cada objecto. Pero lo estoy definiendo desde las propiedades de cada objecto. No desde el create como comentas. Crees que desde el create se ordenaria solo al crear un objecto nuevo en la room???
Cita de: bochaPastore en Agosto 30, 2017, 04:59:10 PM
Pregunta, estas manejando la profundidad de todas las instancias que tenes en la room? O solo la de las luces?
Para que la profundidad de las instancias funcione correctamente, deberias tener la variable depth seteada correctamente en el create de cada instancia. Si no, no te las va a ordenar.
Por ejemplo, si tenes un obj_pared, este tiene q tener un depth tmb.
Deberia funcionar seteandolo por codigo. Yo tuve problemas con la propiedad del objeto.