Cita de: brunoxzx en Julio 17, 2011, 06:06:02 AM
Intenta con este c?digo lo (encontr? en la gmc hace mucho y lo use para uno de mis juegos), va en end step  :-[.
[gml]var xmot, ymot;

if place_meeting(x,y,muro)
{

x = xprevious;y = yprevious

for (i=0; i<90; i+=2)
{
xmot=x+lengthdir_x(speed,direction+i)
ymot=y+lengthdir_y(speed,direction+i)
if place_free(xmot,ymot){x = xmot;y = ymot;exit}
xmot=x+lengthdir_x(speed,direction-i)
ymot=y+lengthdir_y(speed,direction-i)
if place_free(xmot, ymot){x = xmot;y = ymot;exit}
}
}[/gml]

Edit: si no lo entiendes te lo explico.

PERFECTO!

MUCHISIMAS GRACIAS!

Pero si me lo quieres explicar a todo el codigo en espa?ol no tengo problema, hubo partes que creo entenderlas, y quiero estar seguro :D

#16 Julio 17, 2011, 08:05:10 AM Ultima modificación: Julio 17, 2011, 10:44:41 PM por brunoxzx
[gml]var xmot, ymot; //Declaraci?n de variables
/*Explico lo que hace el script en general.
Lo primero que hace es checar si estas colisionando con un muro, si es
cierto te regresa a tu posici?n anterior, despu?s chequea que si tu
direcci?n hubiera sido igual a tu "direcci?n +2" hubieras colisionado con el
muro si si hubieras colisionado se repetir?a el poseso pero esta vez no con
tu "direcci?n +2" sino tu "direcci?n +4" y lo repite sumando 2 hasta que
llegue a 90 o que no exista colisi?n, en caso de que no all? habido
colisi?n se queda en el lugar en el que no hubo colisi?n, y mientras hace
ese proceso hace uno exactamente igual solo que restando 2.

Es decir si tu direcci?n es 90 intenta checar si habr?a habido colisi?n si
tu direccion hubiera sido 92 luego 94 y lo mismo con 88 etc.*/

if place_meeting(x,y,muro) //si estas colisionando con un muro.
{
x = xprevious;y = yprevious //regresas a tu anterior X e Y

for (i=0; i<90; i+=2) // se repite el bucle 45 veces una por cada dos grados.
{ // si no sabes lo que es un for busca en el manual.
xmot=x+lengthdir_x(speed,direction+i)//se guarda tu x + el componente horizontal del vector de tu (direccion+i) y velocidad en la variable xmot.

ymot=y+lengthdir_y(speed,direction+i)//se guarda tu y + el componente vertical del vector de tu (direccion+i) y velocidad en la variable ymot.

/*La traducci?n de esas 2 ultimas lineas de c?digo seria guardar la posici?n
x e y que tendr?as si te hubieras movido en otra direccion, en este caso tu (direccion+i)
Ej:(90+8)*/

if place_free(xmot,ymot){x = xmot;y = ymot;exit} /* Si esta libre la posici?n
anteriormente obtenida te pone en esa posici?n y sale del evento*/

//lo siguiente es lo mismo pero al rev?s osea en lugar de sumar restar.
xmot=x+lengthdir_x(speed,direction-i)
ymot=y+lengthdir_y(speed,direction-i)
if place_free(xmot, ymot){x = xmot;y = ymot;exit}
}
}[/gml]

Edit: no se si hice algo mal pero aveces al usar esto "/*" solo se ponen los primeros 2 caracteres en verde.

Muchisimas gracias brunoxzx!
Me diste la respuesta justa!