Hola! saludos a todos los makeros que estan en la comunidad, hoy les vengo a dejar un script muy util para mover un objeto de forma precisa solo definiendo 3 argumentos, velocidad horizontal, velocidad vertical, y obstaculo del movimiento, lo he testeado y funciona la 100 %  ;)

Creador: Fab62


Version de GM:  :GMS:


Descripción: Mueve un objeto de forma precisa, sin estancarse en el objeto obstaculo que se define en el 3er argumento, las velocidades horizontal y vertical son independientes, es decir, que si el objeto se detiene de forma vertical, puede seguir moviendose de forma horizontal y viceversa, como tambien puede doblar libremente en las esquinas, este script funciona a cualquier velocidad. Su uso sirve en cualquier evento, pero es mas util utilizarlo en el evento step.


Script: Consta de un solo script, y se utiliza de la misma manera que la funcion motion_add()

precise_movement(velocidad horizontal, velocidad vertical, obstaculo)

/****************************************************************************************************************************
    precise_movement(xspeed,yspeed,obstacle)
-----------------------------------------------------------------------------------------------------------------------------
    movimiento preciso con movimientos horizontal y vertical separados
****************************************************************************************************************************/

// obstaculo del movimiento
var obstacle = argument2;

// obtenemos direcciones: vertical y horizontal
var dirh = sign(argument0);
var dirv = sign(argument1);

// para la velocidad de precision
var pspeed = 0;

// loop horizontal
while (pspeed*dirh < argument0*dirh)
{
    // si se encuentra un obstaculo en la velocidad_precision actual, se sale del while
    if place_meeting(x+pspeed+dirh,y,obstacle) break;
    else
    {
        // si se encuentra en una esquina, se puede doblar
        if !place_meeting(x+pspeed+dirh,y+dirv,obstacle)
        && place_meeting(x,y+dirv,obstacle)
            y += dirv;

        // en este caso, velocidad_precision cambia
        pspeed += dirh;
    }
}

// movemos en x
x += pspeed;

// reseteamos la velocidad de precision obtenida
pspeed = 0;

// velocidad de precision en y
while (pspeed*dirv < argument1*dirv)
{
    // si se encuentra un obstaculo en la velocidad_precision actual, se sale del while
    if place_meeting(x,y+pspeed+dirv,obstacle) break;
    else
    {
        // si se encuentra en una esquina, se puede doblar
        if !place_meeting(x+dirh,y+pspeed+dirv,obstacle)
        && place_meeting(x+dirh,y,obstacle)
            x += dirh;

        // en este caso, velocidad_precision cambia
        pspeed += dirv;
    }
}

// movemos en y
y += pspeed;


Espero que les sea de utilidad en sus juegos para que no ocurran esas molestas ocasiones en donde los objetos quedan pegados... un ejemplo sencillo en la siguiente linea.


Ejemplo: Movimiento en 8 direcciones


Evento Create

velocidad = 5

Evento Step

obstaculo = obj_solido;

//---------------------------------------------------------------------------------------------------------------------------
// ACTUALIZAR CONTROLES DE DIRECCION
//---------------------------------------------------------------------------------------------------------------------------

key_left  = keyboard_check(vk_left)
key_right = keyboard_check(vk_right)
key_up    = keyboard_check(vk_up)
key_down  = keyboard_check(vk_down)

//---------------------------------------------------------------------------------------------------------------------------
// ENCONTRAR LAS DIRECCIONES
//---------------------------------------------------------------------------------------------------------------------------

// direccion horizontal
vel_h = velocidad*(key_right - key_left)

// direccion vertical
vel_v = velocidad*(key_down - key_up)

// movemos
precise_movement(vel_h,vel_v,obstaculo);


El obstaculo debe ser un objeto creado con anterioridad y debe representar el objeto solido, que tengan un buen dia y saludos!
El ayer es un recuerdo, el mañana un pensamiento, es el ahora en donde existo y vivo para ser feliz :D

Buen script, no lo he probado pero parece funcional. Solo un pequeño comentario, no es muy importante, pero creo que la función debería llamarse move_precise, para que se parezca a las funciones predefinidas de GM. :D

No se si me leerás, ya que he visto este script bastante tarde. Verás he comprobado que funciona muy bien, pero como estoy empezando en esto de la programación, hay una cosa que no entiendo como funciona y te pido si me podrías hacer el favor de explicarme su funcionamiento.
Me refiero a esta función vel_h = velocidad*(key_right - key_left)
Gracias de antemano

key_left y key_right pueden tomar los valores 0 o 1.

Si ninguno se presiona, entonces se realiza esta operación
  vel_h = velocidad*(0-0) = 0

Si se presiona izuierda, el resultado es diferente
  vel_h = velocidad*(0-1) = -velocidad

Si se presionan los dos botones, el resultado también es cero
  vel_h = velocidad*(1-1) = 0

Muchísimas gracias estoy empezando y tengo que ir aprendiendo.