Octubre 10, 2010, 09:23:20 PM Ultima modificación: Octubre 13, 2010, 06:37:07 PM por slampdesign
Saludos makeros, me he encontrado con un problema, como muchos saben el "Step towards" sirve para que un objeto llegue a un punto determinado, en mi caso es para que llegue a un objeto, es decir en las posiciones va asi:
x=objeto.x
y=objeto.y

Ok, lo que sucede es que al usar esto, el objeto que va a seguir al otro lo hace en la direccion que este.ejemplo:



Quiero que, si el objeto a seguir esta paralelo o diagonal al otro objeto, llegue de forma vertical u horizontal, es decir, haciendo un camino..

Bueno, esto es todo, espero haya una solucion...saludos

Puedes programar que el objeto se mueva en vertical primero hasta alcanzar la altura del objeto a seguir y luego en horizontal hasta llegar al objetivo.
       


#3 Octubre 11, 2010, 02:27:39 AM Ultima modificación: Octubre 11, 2010, 02:36:52 AM por Hackware
As? se entiende naturalmente:
[gml]if (y!=objetivo.y)
{
if (objetivo.y<y) y-=1;
else y+=1;
}
else if (x!=objetivo.x)
{
if (objetivo.x<x) x-=1;
else x+=1;
}[/gml]

Y as? est? optimizado:
[gml]if (y!=objetivo.y)
y+=sign(objetivo.y-y);
else if (x!=objetivo.x)
x+=sign(objetivo.x-x);
[/gml]

P.D. No est? probado.
       

no, pero es que necesito que siga al objeto en la posicion que se encuentre, solo que NO lo siga de forma diagonal, es decir, asi / \..

#5 Octubre 11, 2010, 02:55:17 AM Ultima modificación: Octubre 11, 2010, 02:59:44 AM por Hackware
S?, se supone que con mi c?digo se movar?a primero en vertical y luego en horizontal ?Dices que en su lugar se mueve en diagonal? Tendr? que probarlo... ???

EDIT: Ya lo prob? y funciona perfecto... :-X
       

no, yo no digo que no funcione, solo que segun lo que escribiste:
Cita de: Hackware en Octubre 11, 2010, 02:16:27 AM
Puedes programar que el objeto se mueva en vertical primero hasta alcanzar la altura del objeto a seguir y luego en horizontal hasta llegar al objetivo.

No quiero, que si por casualidad pasa por el mismo punto y o x del 1er objeto, vaya en esa direccion, quiero que el cree su mismo camino en forma vertical u horizontal hasta llegar al objeto...un poco complicado pero es lo que necesito

?Porqu? casualidad? Si lo pones a seguir al mouse podr?s ver que lo seguir? persistentemente. Pero bueno, de todos modos hay otra forma, aunque a decir verdad es bastante compleja as? que no te puedo hacer un ejemplo en mis actuales condiciones.

Esa otra forma son las funciones mp_grid_* que utilizan el m?todo de rejilla; b?scate alg?n ejemplo bonito y me cuentas.
       

Cita de: Hackware en Octubre 11, 2010, 03:09:21 AM
?Porqu? casualidad?

No, digo "casualidad" porque colocaste que solo si pasaba por el punto Y indicado, era que se dirijia al objeto(Bueno, asi lo entendi yo XD), tratare de buscar y vere que hago, cualquier cosa te aviso y gracias...

No juzgues un c?digo hasta haberlo probado. :-X
       

Cita de: Hackware en Octubre 11, 2010, 02:27:39 AM
As? se entiende naturalmente:
[gml]if (y!=objetivo.y)
{
if (objetivo.y<y) y-=1;
else y+=1;
}
else if (x!=objetivo.x)
{
if (objetivo.x<x) x-=1;
else x+=1;
}[/gml]

Y as? est? optimizado:
[gml]if (y!=objetivo.y)
y+=sign(objetivo.y-y);
else if (x!=objetivo.x)
x+=sign(objetivo.x-x);
[/gml]

P.D. No est? probado.
Esos c?digos solo sirven a una velocidad de 1 pixel por step...  :(
El c?digo correcto ( a 4 pixeles por step) ser?a as?:
[gml]if (y!=objetivo.y) if abs(y-objetivo.y)>4
y+=sign(objetivo.y-y)*4; else y=objetivo.y;
else if (x!=objetivo.x) if abs(x-objetivo.x)>4
x+=sign(objetivo.x-x)*4; else x=objetivo.x;[/gml]
Espero haber ayudado

Probe los dos codigos, el de Hackware no me funciono, no se porque y el de Robin28, hace que el objeto que sigue se mueva con el que se debe seguir, es decir en la misma direccion, no me sirve...

Mi ?ltimo intento de que veas que mi c?digo s? sirve... B?jate el adjunto. :(
       

Ok Hackware, tu codigo funciona a la perfeccion, pero se me olvido decirte que tanto el objeto que sigue como a seguir tienen movimiento constante o comienzan moviendose en determinadas direcciones...XD lo lamento...

Cita de: Sacado del nuestro manual traducidoLas dem?s funciones usan un mecanismo mucho m?s complejo basado en rejillas (un algoritmo A*). Tiene m?s ?xito a la hora de encontrar caminos y hacerlos m?s cortos, pero requiere m?s trabajo por tu parte. Adem?s, tambi?n puede fallar en algunas ocasiones. El funcionamiento es como sigue: primero situamos una rejilla sobre la parte del cuarto afectada. Puedes usar si quieres usar una rejilla fina (m?s lento) o m?s espaciada. Despu?s, determinamos las celdas de la rejilla ocupadas por objetos relevantes (usando colisi?n precisa o la caja de contorno) y marcamos estas celdas como prohibidas. As? que una celda estar? prohibida si parte de un obst?culo la est? ocupando. Finalmente especificamos la posici?n inicial y final, que deben estar en celdas libres de la rejilla y la funci?n calcula el camino m?s corto entre ellas. El camino ir? de centro a centro de las celdas libres. As? que las celdas deben ser lo suficientemente grandes como para que la instancia entre totalmente dentro de ellas. Ahora puedes asignar el path a una instancia y hacer que lo siga.

Este sistema es muy potente (se usa en muchos juegos profesionales) pero requiere que lo planifiques con cuidado. Debes determinar la zona del cuarto sobre la que situar la rejilla y el tama?o de las celdas con la mayor precisi?n posible. Tambi?n debes decidir qu? objetos deben tomarse en cuenta y si es necesaria la colisi?n precisa o no. Todos estos par?metros afectan de manera muy notable a la eficiencia del m?todo.

En particular, el tama?o de las celdas es crucial. Recuerda que las celdas deben lo suficientemente grandes como para que la instancia que se mueve entre totalmente dentro de ellas (ten cuidado con la posici?n del origen de la instancia y recuerda que puedes mover el path para hacer que el centro del objeto coincida con el centro de la celda). Por otro lado, cuanto menores sean las celdas m?s caminos diferentes podr?s encontrar. Si haces las celdas demasiado grandes puede que unos pocos objetos ocupen todas las celdas cerrando todos los caminos posibles.

Las funciones para el m?todo de rejilla son:

mp_grid_create(left,top,hcells,vcells,cellwidth,cellheight) Esta funci?n crea la rejilla. Devuelve un ?ndice que debe ser usado en las dem?s funciones. Puedes crear y mantener varias rejillas al mismo tiempo. left y top indican la posici?n de la esquina superior izquierda de la rejilla y hcells y vcells indican el n?mero de celdas horizontales y verticales respectivamente. Finalmente, cellwidth y cellheight indican la anchura y altura de las celdas.
mp_grid_destroy(id) Destruye la rejilla indicada y libera la memoria usada. No olvides llamar a esta funci?n cuando no necesites usar m?s la rejilla.
mp_grid_clear_all(id) Marca todas las celdas como libres.
mp_grid_clear_cell(id,h,v) Marca la celda indicada como libre (la primera celda es la 0,0).
mp_grid_clear_rectangle(id,left,top,right,bottom) Marca como libres todas las celdas que intersectan el rect?ngulo definido en coordenadas absolutas del cuarto.
mp_grid_add_cell(id,h,v) Marca ls celdas indicadas como prohibidas.
mp_grid_add_rectangle(id,left,top,right,bottom) Marca todas las celdas que intersectan el rect?ngulo como prohibidas.
mp_grid_add_instances(id,obj,prec) Marca todas las celdas que intersectan una instancia del objeto indicado como prohibidas. Tambi?n puedes especificar una id de una instancia concreta, o la palabra clave all para indicar todas las instancias. prec indica si hay que usar colisi?n precisa (s?lo funcionar? si en el sprite de la instancia est? activada la misma opci?n).
mp_grid_path(id,path,xstart,ystart,xgoal,ygoal,allowdiag) Calcula el path a trav?s de la rejilla. El path indicado debe existir con anterioridad a la llamada de la funci?n y ser? sobreescrito por el nuevo path (consulta el cap?tulo sobre c?mo crear y destruir paths). xstart e ystart indican el comienzo del path y xgoal e ygoal las coordenadas de la meta. allowdiag indica si se permiten movimientos diagonales entre celdas o s?lo horizontales y verticales. La funci?n devuelve si consigui? calcular un path (observa que el path es independiente de la instancia actual).
mp_grid_draw(id) Esta funci?n dibuja la rejilla marcando las celdas libres y prohibidas (muy ?til para buscar errores).

As? est? el arroz... A ver como lo sacas adelante.