Julio 15, 2012, 09:45:07 PM Ultima modificación: Julio 16, 2012, 06:34:57 AM por Maitreya
Cómo puedo hacer referencia al objeto que ha creado a otro objeto?
Es decir object0 tiene un codigo:
[gml]instance_create(x,y,object1)[/gml]
y quiero que object1 conozca que instancia de object0 lo ha creado para que tome un atributo de el.
¿Comó puedo hacerlo?
Cita de: Fenris78Si un tema os resulta de interes y veis que hay poca información, la mejor solucion no es quejarse o pedir sin pensar, sino sugerir algo bien planteado o aportarlo vosotros mismos.
Cita de: CalioSomos desarrolladores independientes y, por lo tanto, no tenemos por qué guiarnos por las tendencias del mercado.

todas las instancias que creas (que no es lo mismo una instancia que un objeto xd) tienen su propia id que puedes ver pasando el ratón por encima en el editor de rooms (sale en la parte de abajo donde todos los datos, coordenadas, etc..)

y puedes usarlo a tu antojo, como por ejemplo puedes hacer:

(1000001).speed = 0;

entre parentesis, esa es una id. Aunque pongas mil veces un solo objeto en una room, repetida, cada una de las instancias tiene su propia id.
en http://krstudyos.blogspot.com solo hay basura... mejor que ni entres...

Haber si te entendi, tienes el obj0 y atravez de este creas el obj1 y que el obj1 tome un atributo del obj0 cierto?

yo lo hago asi:



obj0
//event create
codigo=0
//codigo la creamos para que guarde el id del obj1

//en el evento en el que creas el obj1

codigo=instance_create(x,y,object1)

codigo.hspeed=hspeed
//luego de esta forma le asignas alguna valor al atributo o variable del obj1



Espero que te sirva. Bye

Como dicen ahí arriba, todas las instancias tienen un ID diferente para ser identificadas en una room. Entonces, para hacer referencia a la instancia que ha creado a otra instancia, puedes tomar su ID, y con ese ID puedes tomar sus atributos, como por ejemplo:

speed = (100001).speed;
direction = (100001).direction;


Para ser más completo te pondré una forma de hacerlo en GML.

Evento Create de object1:
inst = 0;

Un evento de object0:
var obj;

obj = instance_create(x, y, object1);

obj.inst = self.id;    // Aquí almacenaremos la ID de la instancia actual a la variable "inst" de la instancia object1.


Y para tomar algún atributo de la instancia que ha creado a object1, puedes poner en algún evento de object1:
speed = (inst).speed;    // Ejemplo

Espero que te funicone...  ;)

self.id es muy redundante, es como decir yo.yo (y el resultado de esto sería... "yo" xD)




El cuento, y lo que no se como hallar es la ID de la instancia del objeto0 que ha creado a la instancia del objeto1, desde el objeto1, ya que habrán en su momento muchas instancias tanto del objeto0 como del objeto1.
Imaginen un shooter donde vienen varios enemigos hacia ustedes y cada enemigo esta disparando.
Necesito que cada bala conozca qué instancia de enemigo lo ha disparado.
alguna idea?
Cita de: Fenris78Si un tema os resulta de interes y veis que hay poca información, la mejor solucion no es quejarse o pedir sin pensar, sino sugerir algo bien planteado o aportarlo vosotros mismos.
Cita de: CalioSomos desarrolladores independientes y, por lo tanto, no tenemos por qué guiarnos por las tendencias del mercado.

yo lo uso mucho para saber quien ha disparado o cosas así por el estilo

[GML]obj1 = instance_create(20,20,object1);

obj1.creator = id;[/GML]

de ese modo obj1 tendra una variable 'creator' que hace referencia al creador

Checa mi canal de Youtube para tutoriales y charlas sobre desarrollo de videojuegos.


Me doy cuenta de que si agrego variables a una instancia por codigo, no puedo retomarlas en el evento create del objeto, porque no van a existir todavia.
En el siguiente codigo creo la instancia y asigno valores a sus variables de la forma que dijo Jucarave
[gml]if mouse_check_button_pressed(mb_left)
{
    bala_disp = instance_create(x,y,o_bala_p)
    bala_disp.image_angle = image_angle
    bala_disp.direction = image_angle
}[/gml]

Pero estas variables son propias del objeto y ya estan definidas por el  :GM8:

Para el caso de transmitir el id, debo declarar una variable definida por mi, el mismo bloque de código sería:
[gml]if mouse_check_button_pressed(mb_left)
{
    bala_disp = instance_create(x,y,o_bala_p)
    bala_disp.creador = id
}[/gml]

Pero en el evento create del o_bala_p no me va a tomar algo como esto:
[gml]image_angle = creador.image_angle [/gml]
porque la variable creador no va a estar definida, aun si la defino como cero, el evento create sucede exactamente en el momento de la instanciación por lo que no es posible acceder a este luego de crear la instancia para modificar las variables.

En conclusion, funciona con variables propias del  :GM8: pero no con variables definidas por el usuario.

Si alguien le quiere echar mas carreta, bienvenido, sería muy util, pero mi código lo dejo como le primero.

PD: por cierto, gracias a todos por responder hoy mismo XD
Cita de: Fenris78Si un tema os resulta de interes y veis que hay poca información, la mejor solucion no es quejarse o pedir sin pensar, sino sugerir algo bien planteado o aportarlo vosotros mismos.
Cita de: CalioSomos desarrolladores independientes y, por lo tanto, no tenemos por qué guiarnos por las tendencias del mercado.

Veras lo que sucede es lo siguiente:

cuando creas una instancia utilizando 'instance_create', el gm se encarga de ejecutar su evento create, luego sigue con el resto de acciones:

[GML]
if mouse_check_button_pressed(mb_left)
{
    bala_disp = instance_create(x,y,o_bala_p);
    //En el momento que hicieste instance create, el GM ejecuta el evento create para bala_disp,
    //por lo que obviamente aun no esta definida la variable creador


    //Ya que la definimos aquí abajo
    bala_disp.creador = id;
}
[/GML]

hay varias cosas que podrias hacer, un evento create diferente que se ejecute en una alarma:

EV_CREATE o_bala_p
[GML]
alarm[0] = 2;
[/GML]

EV_ALARM_0 o_bala_p
[GML]
image_angle = creador.image_angle;
[/GML]

de este modo te funcionaria con un pequeño retraso de 2*fps, lo cual es practicamente indetectable. ahora bien, yo te aconsejaria en cambio que hicieras el cambio de todas las variables en el momento de crear la bala


[GML]
if mouse_check_button_pressed(mb_left)
{
    bala_disp = instance_create(x,y,o_bala_p)
    bala_disp.image_angle = image_angle
    bala_disp.direction = image_angle
    bala_disp.creador = id; //por si luego la necesitas
}


Saludos.
[/GML]

Checa mi canal de Youtube para tutoriales y charlas sobre desarrollo de videojuegos.


Por un segundo había pensado en hacer lo de la alarma, pero se me hacia que era ya como meterle mucha cosa a algo que podía ser mucho mas simple.
De nuevo gracias a todos.
Lo doy por solucionado.
Cita de: Fenris78Si un tema os resulta de interes y veis que hay poca información, la mejor solucion no es quejarse o pedir sin pensar, sino sugerir algo bien planteado o aportarlo vosotros mismos.
Cita de: CalioSomos desarrolladores independientes y, por lo tanto, no tenemos por qué guiarnos por las tendencias del mercado.

Hay algo más simple aún

global.creador=id
instance_create(x,y,o_bala_p);

Y al principio del create de la bala ponés

creador = global.creador;

Nunca falla, saludos!