Autor Tema: Un objetivo persigue a otro por la id  (Leído 74 veces)

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

Desconectado HKaichim

Un objetivo persigue a otro por la id
« en: Septiembre 14, 2018, 06:54:48 am »
Hola amigos, me gustaria saber si es posible que un Objeto persiga a otro dependiendo de su id, digamos un ejemplo Obj1 genera su id de creacion y el Obj2 debe perseguir a ese objetivo por la id, pero el problema no se queda alli ya que quiero que pueda seguir distintas id del mismo obj a la vez eso se puede o no?


 
No Tienes Permisos Para Dar Puntos
point 0 Puntos

Este tema no recibió puntos.


Desconectado BssString

Re:Un objetivo persigue a otro por la id
« Respuesta #1 en: Septiembre 14, 2018, 03:15:59 pm »
Hola HKaichim

No es posible seguir dos objetos a la vez, con ningún método, tienes que discriminar bajo tus condiciones a qué objeto quieres seguir.

Puedes iterar a través de todos los objetos usando un "with (object_index)" para ver cuál es el más cercano y cuál cumple con tu condición.
Es un poco complicado usar la función with porque el objeto dentro del "with" se convierte ahora en el objeto principal que corre el código, mientras el objeto que originalmente llamó el with, se convierte en "other".

Sabiendo eso, si quieres hacer que el obj2 siga al obj1, puedes hacer lo siguiente en el obj2:
Código: [Seleccionar]
id_seguir = noone //Declaramos una variable de instance (debes llamar el Id del objeto para leerla)
var distancia = -1 //Declaramos una variable local (Existe en el código y cualquier objeto la puede leer, es casi como una variable global, pero se destruye al terminar de ejecutar este código)
with (obj1) if (my_id = 0 || my_id = 1) {
if (distancia = -1) { other.id_seguir = id; distancia = point_distance(x,y,other.x,other.y) }
else {
var new_distancia = point_distance(x,y,other.x,other.y)
if new_distancia < distancia { other.id_seguir = id; distancia = point_distance(x,y,other.x,other.y) }
}
}

Al finalizar la ejecución, El obj2 tendrá guardada una variable de instance llamada "id_seguir" que guarda el instance id del obj1 más cercano.
Favor notar que antes de hacer el cálculo, filtra entre los obj1 para incluir sólo los que tengan la variable "my_id = 0" o "my_id = 1" (le puedes poner lo que necesites ahí).

Después puedes crear el código de seguimiento que quieras, incluso con motion planning. Acá te entrego un movimiento lineal sencillo.
Código: [Seleccionar]
if id_seguir != noone {
var velocidad = 8
if point_distance(x,y,id_seguir.x,id_seguir.y) > velocidad {
var direcccion = point_direction(x,y,id_seguir.x,id_seguir.y)
x += lengthdir_x(velocidad,direccion)
y += lengthdir_y(velocidad,direccion)
}

}

No tengo mi GM a mano, así que cree el código a ciegas, si ocurre algún error favor indícalo y revisamos qué pasó y cómo resolverlo.

Saludos
 
Los siguientes usuarios dieron las gracias a este tema: Yuzo, HKaichim


Desconectado HKaichim

Re:Un objetivo persigue a otro por la id
« Respuesta #2 en: Septiembre 14, 2018, 07:38:56 pm »
Hola HKaichim

No es posible seguir dos objetos a la vez, con ningún método, tienes que discriminar bajo tus condiciones a qué objeto quieres seguir.

Puedes iterar a través de todos los objetos usando un "with (object_index)" para ver cuál es el más cercano y cuál cumple con tu condición.
Es un poco complicado usar la función with porque el objeto dentro del "with" se convierte ahora en el objeto principal que corre el código, mientras el objeto que originalmente llamó el with, se convierte en "other".

Sabiendo eso, si quieres hacer que el obj2 siga al obj1, puedes hacer lo siguiente en el obj2:
Código: [Seleccionar]
id_seguir = noone //Declaramos una variable de instance (debes llamar el Id del objeto para leerla)
var distancia = -1 //Declaramos una variable local (Existe en el código y cualquier objeto la puede leer, es casi como una variable global, pero se destruye al terminar de ejecutar este código)
with (obj1) if (my_id = 0 || my_id = 1) {
if (distancia = -1) { other.id_seguir = id; distancia = point_distance(x,y,other.x,other.y) }
else {
var new_distancia = point_distance(x,y,other.x,other.y)
if new_distancia < distancia { other.id_seguir = id; distancia = point_distance(x,y,other.x,other.y) }
}
}

Al finalizar la ejecución, El obj2 tendrá guardada una variable de instance llamada "id_seguir" que guarda el instance id del obj1 más cercano.
Favor notar que antes de hacer el cálculo, filtra entre los obj1 para incluir sólo los que tengan la variable "my_id = 0" o "my_id = 1" (le puedes poner lo que necesites ahí).

Después puedes crear el código de seguimiento que quieras, incluso con motion planning. Acá te entrego un movimiento lineal sencillo.
Código: [Seleccionar]
if id_seguir != noone {
var velocidad = 8
if point_distance(x,y,id_seguir.x,id_seguir.y) > velocidad {
var direcccion = point_direction(x,y,id_seguir.x,id_seguir.y)
x += lengthdir_x(velocidad,direccion)
y += lengthdir_y(velocidad,direccion)
}

}

No tengo mi GM a mano, así que cree el código a ciegas, si ocurre algún error favor indícalo y revisamos qué pasó y cómo resolverlo.

Saludos
Lo eh estado probando y probando y no logro hacer que funcione, me podrias dar una explicacion con ambos objets?

Desconectado BssString

Re:Un objetivo persigue a otro por la id
« Respuesta #3 en: Septiembre 15, 2018, 01:50:10 am »
Hola HKaichim

No funcionó porque mi código tenía fallas, sorry.
Usé "if (distancia = -1)" en vez de "if (other.id_seguir = noone)".
Además declaré la varible dirección con 3 "c".

Prueba con esta versión corregida del código, ahora sí lo he testeado y por lo menos a mi me ha funcionado xD:
Código: [Seleccionar]
//Código1 - El obj2 elige al obj1 más cercano para comenzar a seguirlo
id_seguir = noone //Declaramos una variable de instance (debes llamar el Id del objeto para leerla)
var distancia = -1 //Declaramos una variable local (Existe en el código y cualquier objeto la puede leer, es casi como una variable global, pero se destruye al terminar de ejecutar este código)
with (obj2) if (my_id = 0 || my_id = 1) {
if (other.id_seguir = noone) { other.id_seguir = id; distancia = point_distance(other.x,other.y,x,y) }
else {
var new_distancia = point_distance(other.x,other.y,x,y)
if new_distancia < distancia { other.id_seguir = id; }
}
}

//Código2 - El obj2 se desplaza hacia el objetivo que quiere seguir
if id_seguir != noone {
var velocidad = 1
if point_distance(x,y,id_seguir.x,id_seguir.y) > velocidad {
var direccion = point_direction(x,y,id_seguir.x,id_seguir.y);
x += lengthdir_x(velocidad,direccion)
y += lengthdir_y(velocidad,direccion)
}
}

Si lo pones en el STEP EVENT del obj1, lo que hace es que el obj1 va a buscar al obj2 más cercano (cuyo my_id del obj2 sea "0" o "1"), entonces el obj1 comienza a moverse en línea recta hacia el obj2.
Si el obj2 tiene "my_id" con un valor 2 o cualquier otro que no sea los antes mencionados, entonces será ignorado por el obj1.

Saludos
« última modificación: Septiembre 15, 2018, 01:55:28 am por BssString »
 
Los siguientes usuarios dieron las gracias a este tema: Yuzo, HKaichim