B?sicamente eso. He probado con instance_nearest poni?ndolo as?:

if instance_nearest=objeto1 {}

Pero no me funciona (seguramente alguno estar? diciendo 'madre m?a...', es natural, soy bastante torpe).

Espero que alguien me pueda echar una manita :).

Gracias de antemano.

var a;
a=instance_nearest(x,y,objecto1)
if a....

Instance_nearest es una funci?n no una variable, como argumentos necesita las coordenadas desde donde checar y el objeto que checar. Para usarla como tu quieres tendria que ser as?:

if instance_nearest(x,y,all).object_index=objeto1 {}

As? busca la instancia m?s cercana y determina si es una instancia de objeto1.


Lo he hecho como ha dicho killer y como ha dicho elviskelley y ninguno me ha funcionado. Voy a explicaros qu? es exactamente lo que quiero hacer: Quiero que un misil detecte cada 5 segundos que instancia tiene m?s cercana, si un misil normal, un misil r?pido o un lanzamisiles, y que se dirija a ?l mediante pathfinding (http://www.comunidadgm.org/index.php?topic=10524.0). Lo del pathfinding lo tengo correcto, pero el problema es que se dirige al objeto en el orden que est? puesto en el evento step. Es decir, ahora mismo tengo en la primera acci?n del evento step lo siguiente: if instance_nearest(x,y,all).object_index=Lanzamisile{}

Y despu?s:
if instance_nearest(x,y,all).object_index=Misil{}
if instance_nearest(x,y,all).object_index=Misilrapido{}

Bien, pues cuando activo el objeto se dirije hacia el lanzamisiles ignorando en todo momento al resto de objetos, e inclusive, tras la destrucci?n del lanzamisiles se quedan quietos, ignorando los que a?n est?n en funcionamiento.

?Cu?l podr?a ser la causa y c?mo podr?a arreglarlo?

Os dejo la informaci?n entera del objeto:

Create Event:
execute code:

var size;
size=32
grilla=mp_grid_create(0,0,room_width/size,room_height/size,size,size)
mp_grid_add_instances(grilla,Maderohor,0)
mp_grid_add_instances(grilla,Maderover,0)
mp_grid_add_instances(grilla,Maderobloqhor,0)
mp_grid_add_instances(grilla,Maderobloqver,0)
ruta=path_add()
set variable objetivofijado to 0
set Alarm 3 to 150

Alarm Event for alarm 0:
if number of objects Lanzamisile is Larger than 0
      if objetivofijado is equal to 0
            set variable objetivofijado to 1
            execute code:

path_end()
    if mp_grid_path(grilla,ruta,x,y,instance_nearest(x,y,Lanzamisile).x,instance_nearest(x,y,Lanzamisile).y,1)=1 path_start(ruta,3,0,1)
      if objetivofijado is not equal to 0
            exit this event
else
      exit this event

Alarm Event for alarm 1:
if number of objects Misil is Larger than 0
      if objetivofijado is equal to 0
            set variable objetivofijado to 2
            execute code:

path_end()
    if mp_grid_path(grilla,ruta,x,y,instance_nearest(x,y,Misil).x,instance_nearest(x,y,Misil).y,1)=1 path_start(ruta,3,0,1)
      if objetivofijado is not equal to 0
            exit this event
else
      exit this event

Alarm Event for alarm 2:
if number of objects Misilrapido is Larger than 0
      if objetivofijado is equal to 0
            set variable objetivofijado to 3
            execute code:

path_end()
    if mp_grid_path(grilla,ruta,x,y,instance_nearest(x,y,Misilrapido).x,instance_nearest(x,y,Misilrapido).y,1)=1 path_start(ruta,3,0,1)
      if objetivofijado is not equal to 0
            exit this event
else
      exit this event

Alarm Event for alarm 3:
set variable objetivofijado to 0
set Alarm 3 to 150

Step Event:
execute code:

image_angle=direction
execute code:

if instance_nearest(x,y,all).object_index=Lanzamisile{}
set Alarm 0 to 1
execute code:

if instance_nearest(x,y,all).object_index=Misil{}
set Alarm 1 to 1
execute code:

if instance_nearest(x,y,all).object_index=Misilrapido{}
set Alarm 2 to 1

Collision Event with object Maderohor:
execute code:

if path_position=1 {
   var dir;
   dir=point_direction(x,y,other.x+sprite_width/2,other.y+sprite_width/2)
   x=x+lengthdir_x(-1,dir)
   y=y+lengthdir_y(-1,dir)
}

Collision Event with object Maderover:
execute code:

if path_position=1 {
   var dir;
   dir=point_direction(x,y,other.x+sprite_width/2,other.y+sprite_width/2)
   x=x+lengthdir_x(-1,dir)
   y=y+lengthdir_y(-1,dir)
}

Collision Event with object Misil:
create instance of object Return at relative position (0,0)
destroy the instance

Collision Event with object Maderobloqhor:
execute code:

if path_position=1 {
   var dir;
   dir=point_direction(x,y,other.x+sprite_width/2,other.y+sprite_width/2)
   x=x+lengthdir_x(-1,dir)
   y=y+lengthdir_y(-1,dir)
}

Collision Event with object Maderobloqver:
execute code:

if path_position=1 {
   var dir;
   dir=point_direction(x,y,other.x+sprite_width/2,other.y+sprite_width/2)
   x=x+lengthdir_x(-1,dir)
   y=y+lengthdir_y(-1,dir)
}

Collision Event with object Lanzamisile:
destroy the instance

Collision Event with object Misilrapido:
destroy the instance


Las variables objetivo fijado las he creado con el fin de que sigan a ese objeto durante un tiempo de 5 segundos, ya que en otros intentos al pasar cerca otro objeto se han desviado hacia ?l.

El problema es que no puedes usar un if en c?digo para condicionar una acci?n D&D:


Citarexecute code:

if instance_nearest(x,y,all).object_index=Lanzamisile{}
set Alarm 0 to 1


O haces que el if tambien sea una acci?n D&D o lo escribes todo en c?digo.

if number of objects Misilrapido is Larger than 0
      if instance_nearest(x,y,all).object_index is equal to Misilrapido
            set Alarm 2 to 1
if number of objects Misil is Larger than 0
      if instance_nearest(x,y,all).object_index is equal to Misil
            set Alarm 1 to 1
if number of objects Lanzamisile is Larger than 0
      if instance_nearest(x,y,all).object_index is equal to Lanzamisile
            set Alarm 0 to 1

Sigue sin funcionar. Lo he puesto as? en D&D y ahora ni se mueve. Se queda est?tica en el punto que se cre?.
He puesto que compruebe el n?mero de instancias para evitar quede colgado al no encontrar instancias de ese tipo. Siento ser tan torpecillo :-[.

#7 Abril 21, 2010, 08:59:17 PM Ultima modificación: Abril 21, 2010, 09:00:58 PM por Killer
Me temo que debo disculparme, he hecho un par de pruebas y resulta que el c?digo que te di no te sirve para lo que quieres. Habr? que complicarse un poco:

var Obj1,Obj2,Obj3;

Obj1 = instance_nearest(x,y,Lanzamisile);
Obj2 = instance_nearest(x,y,Misil);
Obj3 = instance_nearest(x,y,Misilrapido);

if (distance_to_object(Obj1)<distance_to_object(Obj2)&&distance_to_object(Obj1)<distance_to_object(Obj3)) alarm[0]=1;
else if (distance_to_object(Obj2)<distance_to_object(Obj1)&&distance_to_object(Obj2)<distance_to_object(Obj3)) alarm[1]=1;
else if (distance_to_object(Obj3)<distance_to_object(Obj1)&&distance_to_object(Obj3)<distance_to_object(Obj2)) alarm[2]=1;



Este c?digo busca cual es el m?s cercano de cada uno de los 3 tipos de objetos. Luego compara distancias y activa la alarma del m?s cercano de todos. Deberia funcionarte sin problemas.