Hola a todos, mi pregunta es sencilla:
¿Se puede crear una variable global única para cada instancia de un determinado objeto?
Si es posible, de qué forma?

Saludos!

Hola, pero una global como, de que tipo? Se podría crear una global.lista, donde almacenen cada una de las instancia, o lo que sea. Explica un poco mejor para ver que es lo que necesitas exactamente?, que va a guardar esa variable??.

Hola que tal. :D
Bueno mi idea es hacer que los enemigos dentro del juego suelten un determinado objeto, una única vez al matarlos.
Por lo que tenía en mente usar una variable global booleana para saber si ha soltado o no el ojbeto. Pero claro, necesitaría una variable global para cada instancia de un determinado objeto.

Ese es mi problema :-[


#3 Mayo 27, 2015, 06:54:13 PM Ultima modificación: Mayo 27, 2015, 06:57:23 PM por penumbra
A mi modo de ver, creo que no, y tampoco le veo la necesidad, no por cuestión de optimización (memoria), sino porque las variables globales no pertenecen a ninguna instancia en específico, por eso son globales, y creo que en GML no hay un método para hacer declaraciones de variables globales de manera procedural, entonces, la declaración de variable global sólo puede hacerse en el objeto de manera manual, pero claro, si ese objeto tendrá distintas instancias, todas ejecutarán la misma declaración de variable global, lo cual no tiene sentido.

Creo que lo mejor sería usar un objeto controlador para llevar un registro de qué instancias han soltado un objeto y cuales no (arreglo, grid, mapa). Así, sea que haya 100 instancias o 10000, todas ellas se pueden guardar en una estructura, para saber si han soltado el item, y todo este registro se puede acceder siempre de la misma manera, con un solo nombre, porque en el caso de usar globales, se tendría que estar cambiando el nombre de la variable en cuestión.

Para mi la mejor opcion seria crear una array con numero de instancia y true o false segun tire o no.

El sistema que se me ocurre, con suficiente robustez para evitar problemas como ids repetidas, es usar una ds_list para cada room y un ds_map para acceder a las listas.

Primero se crea el mapa
[gml]global.mapa = ds_map_create();[/gml]
Al entrar a una room se revisa si no está en el mapa, entonces se agrega y se crea una lista para esa room
[gml]
if( not ds_map_exists( global.mapa, room ) )
ds_map_add( global.mapa, room, ds_list_create() );
[/gml]
Eso lo debe hacer un objeto controlador antes de que las demás instancias ejecuten el siguiente código
[gml]
if ds_list_find_index( global.mapa[?room], id )
soltar_objeto = false;
else
soltar_objeto = true;
[/gml]
En el código anterior se revisa si el id se encuentra en la lista creada para la room actual, si es así, la instancia ya soltó un objeto y la variable se hace false, en caso contrario la variable es true.
Al destruir un enemigo debe agregar su id a la lista
[gml]
ds_list_add( global.mapa[?room], id );
[/gml]

A mi ahora pensando, me surgen dudas, quieres que se guarde esa información para la próxima vez que entres al juego??. Esos objetos son siempre los mismos en la room, es decir, en la room1  5 enemigos de tipo talcual. Room2 7 enemigos tal cual.
Pues poner hacer un .ini, con el nombre de la room y la cantidad de objetos tirados, si supera la cantidad de enemigos que no tire mas, si es menos, que suelte alguno con alguna probabilidad, por ejemplo, 5 --100%, tiran 1,  al 75%, tiran 2. al 50%, y así sucesivamente.
O si tienes diferente tipos de enemigos y de objetos, el ini con esta estructura
[ROOM1]
enemigo = 1
enemigo2= 0
enemigo3=4    (siendo esto la cantidad de objetos, suponiendo que haya varios del mismo objeto)
Si solo hubiera 1 por objeto, podrias poner false o true.

Primero que nada, agradezco a todos por las respuestas!  :D

Cita de: arcangelcaos en Mayo 27, 2015, 08:06:14 PM
A mi ahora pensando, me surgen dudas, quieres que se guarde esa información para la próxima vez que entres al juego??. Esos objetos son siempre los mismos en la room, es decir, en la room1  5 enemigos de tipo talcual. Room2 7 enemigos tal cual.
Pues poner hacer un .ini, con el nombre de la room y la cantidad de objetos tirados, si supera la cantidad de enemigos que no tire mas, si es menos, que suelte alguno con alguna probabilidad, por ejemplo, 5 --100%, tiran 1,  al 75%, tiran 2. al 50%, y así sucesivamente.
O si tienes diferente tipos de enemigos y de objetos, el ini con esta estructura
[ROOM1]
enemigo = 1
enemigo2= 0
enemigo3=4    (siendo esto la cantidad de objetos, suponiendo que haya varios del mismo objeto)
Si solo hubiera 1 por objeto, podrias poner false o true.
Si también quisiera que se guardara al cerrar el juego, pero claro, eso creo que lo tendré cubierto. Sino pregunto luego xD

Cita de: Clamud en Mayo 27, 2015, 08:00:39 PM
El sistema que se me ocurre, con suficiente robustez para evitar problemas como ids repetidas, es usar una ds_list para cada room y un ds_map para acceder a las listas.

Primero se crea el mapa
[gml]global.mapa = ds_map_create();[/gml]
Al entrar a una room se revisa si no está en el mapa, entonces se agrega y se crea una lista para esa room
[gml]
if( not ds_map_exists( global.mapa, room ) )
ds_map_add( global.mapa, room, ds_list_create() );
[/gml]
Eso lo debe hacer un objeto controlador antes de que las demás instancias ejecuten el siguiente código
[gml]
if ds_list_find_index( global.mapa[?room], id )
soltar_objeto = false;
else
soltar_objeto = true;
[/gml]
En el código anterior se revisa si el id se encuentra en la lista creada para la room actual, si es así, la instancia ya soltó un objeto y la variable se hace false, en caso contrario la variable es true.
Al destruir un enemigo debe agregar su id a la lista
[gml]
ds_list_add( global.mapa[?room], id );
[/gml]

Dejame ver si entiendo, lo que hace es crear un mapa, los cuales van de a pares, no?
Entonces se crea una entrada con el nombre del room, en donde el valor no es más que una lista dinámica?

Me perdí en la parte donde se utiliza esta notacion "global.mapa[?room]" qué significa específicamente? En mis tiempos no se utilizaba (?) XD


Cita de: Silver_light en Mayo 27, 2015, 10:09:39 PM
Me perdí en la parte donde se utiliza esta notacion "global.mapa[?room]" qué significa específicamente? En mis tiempos no se utilizaba (?) XD

Es una nueva característica introducida en GM:S 1.3 (si no mal recuerdo) llamada "Accessors" Los accessors permiten acceder a los valores guardados en mapas, listas, grids como si se estuviera trabajando con arreglos, por eso el uso de los corchetes o paréntesis cuadrados. El manual contiene ejemplos.  Si no quieres trabajar con accessors, entonces se usaría la clásica función ds_map_find_value()