Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: lorenzo en Octubre 14, 2014, 06:28:57 AM

Título: Seguir a la segunda instancia mas cercana
Publicado por: lorenzo en Octubre 14, 2014, 06:28:57 AM
Como hago para que un auto se diriga al objeto(espacio_libre) segundo mas cercano si la primera instacia de espacio libre tiene la variable ocupado en 1

el auto chequee si el espacio_libre mas cercano tiene la variable ocupado en 0 ,si la primer instancia mas cercana tiene ocupado en 1 que se diriga a la instancia segunda mas cercana y si esta tiene ocupado en 0 que se detenga hay.

Título: Re:Seguir a la segunda instancia mas cercana
Publicado por: Marth en Octubre 14, 2014, 04:33:14 PM
Lo suyo seria primero comprobar la distancia de todos los elementos descartando a quien este "ocupado" y luego seleccionar al que este más cerca.
Si pasases el código utilizado podría entender mejor que ocurre.
Título: Re:Seguir a la segunda instancia mas cercana
Publicado por: lorenzo en Octubre 14, 2014, 05:09:34 PM
en el objeto auto solo tengo step esto

move_towards_point(instance_nearest(x,y,espacio).x,instance_nearest(x,y,espacio).y,2)



en el evento create del objeto espacio tengo
ocupado=choose(1,0)
Título: Re:Seguir a la segunda instancia mas cercana
Publicado por: Marth en Octubre 14, 2014, 08:34:51 PM
with(Aparcamiento) if(!ocupado){move_toward_point() break}

A ver si así se soluciona.
Título: Re:Seguir a la segunda instancia mas cercana
Publicado por: Clamud en Octubre 14, 2014, 11:37:49 PM
Hola. Puedes usar un script como el siguiente:
[gml]
/* scEspacioLibre */

global.mapa = ds_map_create();
var distancia, instancia;

//Almacenar en un mapa las distancias junto con los id de las instancias desocupadas
with( espacio_libre )
{
    if( not ocupado )
    ds_map_add( global.mapa, point_distance(x,y,other.x,other.y), id );
}

//Si hay instancias desocupadas
if( ds_map_size(global.mapa) > 0 )
{
    //Encontrar la distancia más pequeña con el id correspondiente
    distancia = ds_map_find_first( global.mapa );
    instancia = ds_map_find_value( global.mapa, key );
    ds_map_destroy( global.mapa );
    return instancia;
}
else //Si no hay instancias o todas están ocupadas
{
    //Devolver la constante "ninguna"
    ds_map_destroy( global.mapa )
    return noone;
}
[/gml]
que te devuelve el id de la instancia desocupada más cercana.
Después puedes usar la función de movimiento que te mencionaron.
Título: Re:Seguir a la segunda instancia mas cercana
Publicado por: lorenzo en Octubre 15, 2014, 02:40:55 AM
pero como pongo ese script? que objeto debe ejecutarlo? ademas no tiene argumentos?
math no me funciono lo que pusiste.
ayudenme
Título: Re:Seguir a la segunda instancia mas cercana
Publicado por: Clamud en Octubre 15, 2014, 06:02:28 AM
Para usarlo agrega un nuevo recurso script y copia el código, dale un nombre claro, a mi se me ocurrió "scEspacioLibre", pero tú nombralo como más te convenga.
El objeto que debe ejecutarlo es el que se mueve, o el objeto a partir del cual se mide la distancia. Cada vez que necesites saber cuál es el espacio libre más cercano ejecuta la siguiente línea:
[gml]cercano = scEspacioLibre();[/gml]
así sin argumentos. Ésto puede ir en el evento step, o en otro evento si no quieres que se haga el chequeo constantemente.
Entonces obtenemos las coordenadas del punto al que debe moverse el objeto:
[gml]
xto = cercano.x;
yto = cercano.y;
[/gml]
Y entonces puedes usar alguna de las funciones que aparecen en las secciones "Movement" o "Motion Planning", del manual, para realizar el movimiento.