Febrero 01, 2010, 09:15:19 PM Ultima modificación: Febrero 02, 2010, 12:40:56 AM por hardraid
Creador: HardRaid
Version GM: :GM8: :GM7: :GM6: y creo q  :GM5: por que usa 3 funciones muy basicas y viejas.
Descripcion: Este script coloca al objeto actual en la posicion libre mas cercana, para ello lo que hace es recorrer circularmente todos los puntos cuantitativamente dependiendo de la tolerancia(argument0). con este script pueden realizar colisiones perfectas, sin q se trabe en la pared o algo parecido. con respecto a la tolerancia(argument0) es opcional por lo tanto si quieren no pongan nada y el valor por defecto sera 1 que es la tolerancia mas precisa y la mas lenta, yo recomiendo que usen entre 2 y 10 dependiendo como les afecte.
Codigo:

/* argument0 es la tolerancia utilizada para aumentar o disminuir la precision
   y por consiguiente la optimizacion, un valor igual a 1 es la maxima precision
   y la mas lenta, valores superiores disminuyen la presicion pero aumenta los FPS considerablemente,
   no es necesario utilizar valores muy grandes para aumentar los FPS, con solo poner la
   tolerancia entre 2 y 10 se va a notar el cambio.
   
   scr_libre(tolerancia);*/
var ll, dd, xx, yy, tol;
ll=0;
dd=0;
xx=x;
yy=y;
if(argument0){tol=argument0;}else{tol=1;}

while (!place_free(x,y))
{
   dd+=tol;
   ll+=1/(360/tol);
   x=lengthdir_x(ll,dd)+xx;
   y=lengthdir_y(ll,dd)+yy;
}
?Eres experto en Game Maker y quieres ense?ar lo que sabes? ?nete a nuestro proyecto como tutor. ?Tienes en mente un gran juego pero no sabes como usar Game Maker? Inscr?bete y un tutor te guiar?. Aprender?s dise?ando un juego para luego dise?ar el tuyo propio. Ap?ntate en http://www.comunidadgm.org/index.php?topic=10462.0.

Aun no lo he probado pero tiene buena pinta...
Aunque no se muy bien para qu? podria usarlo...
?Podrias hacer que vaya a la posici?n m?s cercana de cierta instancia? Estar?a de put* madre para IA,s con cobertura.

Saludos!

- Como hacer preguntas inteligentes
- Reglamento General
Hay que molestarse en mirar el manual...?Que no muerde!

#2 Febrero 04, 2010, 12:50:14 AM Ultima modificación: Febrero 04, 2010, 12:52:13 AM por hardraid
Tendria que hacer dos scripts asi:


//scr_obj_xlibre(objeto,tolerancia);
var ll,dd,xx,yy,x2,y2,tol;
ll=0;
dd=0;
xx=argument0.x;
yy=argument0.y;

if(argument0){tol=argument0;}else{tol=1;}

while (!place_free(x2,y2))
{
   dd+=tol;
   ll+=1/(360/tol);
   x2=lengthdir_x(ll,dd)+xx;
   y2=lengthdir_y(ll,dd)+yy;
}
return(x2);



//scr_obj_ylibre(objeto,tolerancia);
var ll,dd,xx,yy,x2,y2,tol;
ll=0;
dd=0;
xx=argument0.x;
yy=argument0.y;

if(argument0){tol=argument0;}else{tol=1;}

while (!place_free(x2,y2))
{
   dd+=tol;
   ll+=1/(360/tol);
   x2=lengthdir_x(ll,dd)+xx;
   y2=lengthdir_y(ll,dd)+yy;
}
return(y2);


Y lo podes usar asi:

move_towards_point(scr_obj_xlibre(paquito),scr_obj_ylibre(paquito),3);




?Eres experto en Game Maker y quieres ense?ar lo que sabes? ?nete a nuestro proyecto como tutor. ?Tienes en mente un gran juego pero no sabes como usar Game Maker? Inscr?bete y un tutor te guiar?. Aprender?s dise?ando un juego para luego dise?ar el tuyo propio. Ap?ntate en http://www.comunidadgm.org/index.php?topic=10462.0.

Muchas gracias por compartir el código @hardraid , había yo estado intentando muchas maneras de que mis enemigos colisionaran con la pared perfectamente.  :)

Lo he probado y da como error que no reconoce la var X2

Eso sucede si has intentado utilizar el Script tal y como está escrito más arriba. Puesto que a pesar de que está declarada, no está inicializada. Es decir, no tiene un valor, a menos claro que entre en el cuerpo de While, pero en caso contrario si no cumple la condición no entraría nunca, lo cual dejaría a x2 sin valor, y es en esos casos donde no reconoce dicha variable.

Eso pensé y la inicialice a 0; pero igual dio ese error.