Comunidad Game Maker

Ayuda => Desarrollo de Scripts => Mensaje iniciado por: hardraid en Febrero 01, 2010, 09:15:19 PM

Título: posicion libre mas cercana
Publicado por: hardraid en Febrero 01, 2010, 09:15:19 PM
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;
}
Título: Re: posicion libre mas cercana
Publicado por: Zeneka en Febrero 03, 2010, 09:41:10 PM
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!
Título: Re: posicion libre mas cercana
Publicado por: hardraid en Febrero 04, 2010, 12:50:14 AM
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);




Título: Re:posicion libre mas cercana
Publicado por: Luto en Enero 20, 2013, 06:42:28 AM
Muchas gracias por compartir el código @hardraid , había yo estado intentando muchas maneras de que mis enemigos colisionaran con la pared perfectamente.  :)
Título: Re:posicion libre mas cercana
Publicado por: elviskelley en Enero 20, 2013, 01:54:58 PM
Lo he probado y da como error que no reconoce la var X2
Título: Re:posicion libre mas cercana
Publicado por: Silver_light en Enero 25, 2013, 03:44:02 PM
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.
Título: Re:posicion libre mas cercana
Publicado por: elviskelley en Enero 26, 2013, 01:45:16 AM
Eso pensé y la inicialice a 0; pero igual dio ese error.