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?
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.
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?
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
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
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]
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.
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!