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:
(http://img45.xooimage.com/files/6/8/b/ejemplo-imagen-213bee1.png)
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.
algun ejemplo? 8)
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 / \..
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.
Pues, la verdad que no se que hacer :-[... de todas maneras gracias Hackware...
Cita de: slampdesign en Octubre 12, 2010, 06:02:17 PM
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...
no creo que tenga que ver en que momento comienzan a moverse o si su movimiento es constante (amenos que el objeto este intentando moverse a otro lado mientras se ejecuta el script) si quieres adjunta tu juego aver que se puede hacer
A ver, supongamos que estoy haciendo un juego tipo RPG, y tengo mi obj_personaje, quiero que lo persiga un enemigo, pero solo de manera horizontal o vertical (en forma de L)...algun ejemplo, debo decir que al girar o cambiar la direccion debe cambiar el sprite de acuerdo al valor...
pues eso hace el script anterior
[gml]if (y!=objetivo.y)
{
if (objetivo.y<y) y-=1;/*sprite_index=imagen_arrba*/;
else y+=1; /*sprite_index=imagen_abajo*/;
}
else if (x!=objetivo.x)
{
if (objetivo.x<x) x-=1;/*sprite_index=imagen_izquierda*/;
else x+=1;/*sprite_index=imagen_derecha*/;
}[/gml]
lo mas probable es que lo est?s usando mal revisa que no est?s intentando usar alg?n otro movimiento al mismo tiempo que se ejecuta este script
Segun revise, el problema de ese script es que no cambia la direccion del objeto...podrian optimizarlo para que lo haga?
[gml]if (y!=objetivo.y)
{
if (objetivo.y<y) y-=1;direction=90;
else y+=1; direction=270;
}
else if (x!=objetivo.x)
{
if (objetivo.x<x) x-=1;direction=180;
else x+=1;direction=0;
}[/gml]
?as??
Ese codigo esta mal hecho, lo siento... :-[
No he probado el c?digo de brunoxzx, pero a?n si no funcionace perfectamente deber?as estar en capacidad de estudiarlo, comprenderlo y corregirlo, porque personalmente me parece que se trata de una pieza de c?digo que incluso se puede desarrollar en D&D.
Me produce enfado que a cada intento de ayudarte solo sepas responder "Tu c?digo no me sirve" ?En verdad tratas de aprender a crear videojuegos o solo intentas ahorrarte esa fatiga? Ponte serio y si en verdad es tan espec?fico lo que necesitas entonces sube el editable para ver qu? es lo que est? impiendo aplicar nuestras soluciones en tu juego.
De verdad Hackware, agradezco tu ayuda y tu tiempo, pero no tengo porque recibir malos tratos de tu parte, el foro es para los que deseen ayudar a los demas, eso implica poner un poco de tu tiempo, comprension y paciencia con los demas usuarios, si estas "harto" por decir algo, de algun tema, lo que debes hacer es no contestarlo y ya...Tu siempre me has ayudado y estoy consciente de eso...
No te estoy tratando mal, s?lo te pido con total sinceridad que hagas conciencia de que los que tratamos de ayudar a los principiantes poniendo nuestro tiempo, comprensi?n y paciencia al servicio de los dem?s s?lo esperamos como paga que el usuario beneficiado sepa aprovechar lo que le aconsejamos y NO de nosotros.
Ahora bien, te vuelvo a instar que subas el editable (preferiblemente conteniendo s?lo los objetos involucrados en el problema) para que podamos ver de primera mano qu? es lo que est? "mal hecho" para luego recapitular qu? es lo que estabas omitiendo.
Cita de: slampdesign en Octubre 16, 2010, 01:22:39 AM
De verdad Hackware, agradezco tu ayuda y tu tiempo, pero no tengo porque recibir malos tratos de tu parte, el foro es para los que deseen ayudar a los demas, eso implica poner un poco de tu tiempo, comprension y paciencia con los demas usuarios, si estas "harto" por decir algo, de algun tema, lo que debes hacer es no contestarlo y ya...Tu siempre me has ayudado y estoy consciente de eso...
hackware simplemente te dijo lo que muy probablemente te habria dicho bueno tal vez un poco menos agresivamente por as? decirlo, por ejemlo mira este comentario
Cita de: slampdesign en Octubre 15, 2010, 06:23:49 PM
Ese codigo esta mal hecho, lo siento... :-[
ese comentario no me sirve de nada a mi, de echo tal vez me ofende un poco al menos pon algo con lo que te pueda ayudar dime que es lo que le pasa a tu juego o si no funciona de ning?n modo adjuntalo como dijo hackware
OK saliendo de ese tema ponte a pensar por que no funciona el c?digo, y si definitivamente no se te ocurre nada para hacerlo funcionar adjuntalo no pasa nada y si aun as? no quieres p?salo por mp aver que se puede hacer
UPPS: hackware se me adelanto
Esta bien, subire el editable, solo que en otro momento porque no lo tengo a la mano...