В своё время где-то украл очень удобный кусок кода (а может и частично доработал, хз, не помню):
"Step Event"
Код
right = keyboard_check(k_right);
left = -keyboard_check(k_left);
up = -keyboard_check(k_up);
down = keyboard_check(k_down);
//Movement
hmove = left + right;
vmove = up + down;
hsp = hmove * (speh - abs(vmove/2));
vsp = vmove * (spev - abs(hmove/2));
//Collision
if (place_meeting(x+hsp,y,o_wall)) then {
while(!place_meeting(x+sign(hsp),y,o_wall)) {
x += sign(hsp);}
hsp = 0;} x += hsp;
if (place_meeting(x,y+vsp,o_wall)) then {
while(!place_meeting(x,y+sign(vsp),o_wall)){
y += sign(vsp);}
vsp = 0;} y += vsp;
где:
spev - скорость вертикальная
speh - скорость горизонтальная
o_wall - стена