Noticias

Importante: ¡Si quieres publicar tu juego no olvides leer este tema!

* Sponsor

Comunidad Game Maker

Bienvenid@ a la comunidad hispana de Game Maker. Nuestro objetivo es crear videojuegos y dar soporte en castellano de GM. Para mejorar nuestro servicio hemos implantado, como adicion al reglamento general, algunas normas especificas en los subforos más comunes. ¡No olvides informarte antes de participar!.

Autor Tema: Acceso a datos de objetos inactivos [Solucionado]  (Leído 724 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Marth

en: Diciembre 10, 2020, 08:23:15 pm
Verán, estoy interesado en poder acceder a información de objetos que permanecen inactivos.
En el ejemplo que adjunto, tengo un objeto Enemigo al cual puedo acceder a su valor de PS siempre que esté activo y dará error si no lo está.
Pues me gustaría saber si es posible acceder a sus datos cuando está inactivo.
Eso me haría las cosas más cómodas, por ejemplo si necesitase guardar en un fichero el valor de una variable de un objeto inactivo, ya que podría guardarlo sin necesidad de activar antes el objeto.
« Última modificación: Diciembre 13, 2020, 01:46:28 pm por Marth »

 
Los siguientes usuarios dieron las gracias a este tema: dixon


No Tienes Permisos Para Dar Puntos
point 0 Puntos

Este tema no recibió puntos.


Desconectado dixon

Respuesta #1 en: Diciembre 11, 2020, 03:17:32 am
Hola, saludos cordiales.

Para acceder al valor de una variable de un objeto inactivo esta tiene que estar dentro de un script externo.
Ejemplo:
1)   En el evento créate del objeto inactivo escribes el nombre del script que contendrá el nombra de la variable a llamar. Ejemplo:
Script_objeto_inactivo()
ps=0
return ps

2)   El objeto, que obtendrá la variable del objeto inactivo, tendrá que ejecutar el script
///Obteniendo la variable del objeto inactivo
Variable_inactiva=script_objeto_inactivo()

Bien, el objeto está inactivo y podemos acceder a la variable que se haya declarado en el script.
Ahora bien, supongamos que queremos acceder a varias variables del objeto inactivo:

1)   En el evento creación llamamos al script "script_objeto_inactivo()", y este script debe contener:
script_objeto_inactivo()
ps=0;
live=100;
hp=20;

if(argument0="ps")
{
return ps;
}
if(argumento0="live")
{
return live;
}
if(argumento0="hp")
{
return hp;
}

Esto también se puede hacer con la sentencia switch.

2)   El objeto que quiere obtener la variable del objeto inactivo tiene que llamar al script y especificar la variable:
////Obteniendo alguna variable de un objeto inactivo
Vida_obj_inactivo= script_objeto_inactivo("live");
Hp_obj_inactivo=script_objeto_inactivo("hp");
Ps_objeto _inactivo("ps");

Bien, pues ya podemos obtener cualquier variable del objeto inactivo…

Pero, bueno, supongamos que queremos un solo script, solo un script que controle a todos los objetos inactivos y pueda acceder a cualquiera de sus variables.

Bueno:

1)   En el evento créate de los objetos inactivos, llamamos al mismo script
Script_objetos_inactivos("asignar","objeto1","variables")

2)   En el script escribimos
if(argument0="objeto1")
{
hp=5;
ps=10;
live=3;
}
if(argument0="objeto2")
{
hp=10;
ps=20;
live=5;
}

if(argument0="obtener")
{
if(argument2="hp")
{
return hp;
}

if(argument2="live")
{
return live;
}

if(argument2="ps")
{
retur ps;
}
}

3)   En el objeto que obtendrá las variables de los objetos inactivos escribimos:
///obtener variables de los objetos inactivos
Obteto1_ps=script_objetos_inactivos("obtener","objeto1","ps")
Obteto2_hp=script_objetos_inactivos("obtener","objeto2","hp")

Listo,  :-[


Si Dios quiere; Limpiaré la oficina, puliré el piso y les serviré café a todos, luego, me enseñarán a programar e iré a comprarles más café.
 


Desconectado Marth

Respuesta #2 en: Diciembre 11, 2020, 12:04:30 pm
Diria que con lo que sugieres, Dixon, no estás realmente accediendo al valor de un objeto inactivo, sino usas un script para asignar valores a los objetos.
Digamos que un objeto Enemigo puede tener un valor de ataque entre 3 y 7. Lo vuelvo inactivo y quiero acceder a su valor exacto sin necesidad de activarlo.
Al ser un número al azar, el truco de usar un script para almacenar y recuperar su valor no va a servir esta vez.


Desconectado dixon

Respuesta #3 en: Diciembre 11, 2020, 07:49:26 pm
Tube que recurrir al manual y estas indicaciones encontré:

1)   Tenga en cuenta también que la activación y desactivación no son instantáneas,
2)   Una instancia desactivada efectivamente deja de existir en el juego, pero las instancias individuales aún pueden tener acceso a sus variables.
3)   Sin embargo, no puede usar con (objeto) o con (instancia) , sino que debe acceder a la instancia directamente usando su identificación única en la siguiente forma
val = inst.variable;
Ejemplo
val=object1.variable;
4)   NOTA: Si desactiva una instancia al iniciar la sala (es decir, desde el código de creación de la sala o desde un evento de creación de instancia de una instancia dentro de la sala), todas las instancias que se colocan dentro de la sala desde el editor de sala seguirán ejecutando su evento de creación antes de ser desactivado.

Opiniones:
Creo que el problema no es obtener la variable del objeto inactivo, el problema es obtener su id.
Lo que se puede hacer para obtener el id de las instancias inactivas es crear una lista que contenga todas las id con sus respectivas posiciones (x,y) de las instancias. Para luego evaluar si la distancia a algún objeto coincide con las posiciones y si se devuelve o no el id. Es decir, buscaremos un punto en el plano donde se encuentre la instancia, pero este punto será previamente almacenado en una lista. Ahora bien el objeto inactivo, luego de seguro volverá a activarse y su posición tendrá que actualizarse en la lista para que cuando se vuelva a desactivar se pueda acceder a él.

Hice una prueba pequeña  pero sin la dslits,
El objeto inactivo tiene en su evento créate:

aleatorio=random(10)
global.id_inactivo=id

El objeto que desactiva instancias ejecutó:
instance_deactivate_object(object1)

Luego este objeto solicitó la variable de la instancia inactiva de esta forma:
inst=global.id_inactivo
numero=inst.aleatorio;

Luego la instancia inactiva, volvió a activarse y el valor de la variable aleatoria era el mismo, confirmando de que no se vuelve a ejecutar el evento create.

Este experimento funcionó correctamente, ahora solo quedaría utilizar las dslist para administrar a un número x de instancias.

Nota extra: nunca he usado la desactivación de instancias pero siempre la he necesitado y de ahora en adelante creo que la voy a usar. Antes, cuando el objeto salía de la view lo que hacía eliminarlo y luego creaba otro que servía de guía.

 :-[

Si Dios quiere; Limpiaré la oficina, puliré el piso y les serviré café a todos, luego, me enseñarán a programar e iré a comprarles más café.
 
Los siguientes usuarios dieron las gracias a este tema: Marth


Desconectado dixon

Respuesta #4 en: Diciembre 13, 2020, 03:16:21 am
Dos formas más:

Otra forma sería almacenar cada id en una variable global por cada objeto (como en el ejemplo del comentario anterior) y recurrir a esta cuando el objeto esté inactivo para obtener su id y luego la variable.

También se puede activar la instancia por un instante, obtener su id y volver a desactivarla. Para luego usar su id y obtener la ps. No creo que haya problemas en activar y desactivar una instancia en una pequeña fracción de tiempo, pues si se activa y desactiva en un mismo step (paso), sus variables deberían permanecer y ya sabemos que su evento créate no se vuelve a ejecutar.

 ;D



Si Dios quiere; Limpiaré la oficina, puliré el piso y les serviré café a todos, luego, me enseñarán a programar e iré a comprarles más café.
 


Desconectado Marth

Respuesta #5 en: Diciembre 13, 2020, 01:46:14 pm
Al almacenar el id en una variable ya si puedo acceder a los datos de los objetos inactivos.
Aunque es una forma bastante incomoda, pues si tengo 30 objetos, tengo que hacer algo plan un vector de 30 elementos, y conforme estos objetos se creen y se destruyen tengo que irlos añadiendo o retirando del vector, pero esto me soluciona el problema.