Musisz rozdzielić kolizję na 2 osie z osobna. Nie sprawdzaj kolizji w obu osiach na raz w jednym warunku bo wtedy zatrzymasz ruch w obu a tego nie chcesz, chcesz zatrzymać 1 oś.
prosty przykład:
dla sztywnych kierunków
GML
if ( keyboard_check( vk_left ) ) if ( !place_meeting(x - predkosc, y, Wall) ) x -= predkosc;
if ( keyboard_check( vk_right ) ) if ( !place_meeting(x + predkosc, y, Wall) ) x += predkosc;
if ( keyboard_check( vk_up ) ) if ( !place_meeting(x, y - predkosc, Wall) ) y -= predkosc;
if ( keyboard_check( vk_down ) ) if ( !place_meeting(x, y + predkosc, Wall) ) y += predkosc;
lub dla twojego analogu
GML
// wektor ruchu
HS = hspeed;
VS = vspeed;
if ( !place_meeting(x+HS, y, Wall) ) { x += HS; hspeed = 0; }
if ( !place_meeting(x, y+VS, Wall) ) { y += VS; vspeed = 0; }