Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: Monigote en Abril 17, 2010, 07:42:12 PM

Título: Comprobar instancia m?s cercana
Publicado por: Monigote en Abril 17, 2010, 07:42:12 PM
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.
Título: Re: Comprobar instancia m?s cercana
Publicado por: elviskelley en Abril 17, 2010, 08:12:00 PM
var a;
a=instance_nearest(x,y,objecto1)
if a....
Título: Re: Comprobar instancia m?s cercana
Publicado por: Killer en Abril 17, 2010, 08:13:25 PM
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.
Título: Re: Comprobar instancia m?s cercana
Publicado por: soccer2008 en Abril 18, 2010, 05:53:35 PM
http://www.comunidadgm.org/index.php?topic=10421.0 (http://www.comunidadgm.org/index.php?topic=10421.0)
Título: Re: Comprobar instancia m?s cercana
Publicado por: Monigote en Abril 20, 2010, 10:15:29 PM
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 (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.
Título: Re: Comprobar instancia m?s cercana
Publicado por: Killer en Abril 21, 2010, 07:30:35 AM
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.
Título: Re: Comprobar instancia m?s cercana
Publicado por: Monigote en Abril 21, 2010, 03:23:38 PM
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 :-[.
Título: Re: Comprobar instancia m?s cercana
Publicado por: Killer en Abril 21, 2010, 08:59:17 PM
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.