@TheMarcQ: twój kod też jest zły.
Moja propozycja to zrezygnowanie ze zmiennych speed i direction.
GML
if(keyboard_check(vk_left)) x -= 3
else if(keyboard_check(vk_right)) x += 3
if(keyboard_check(vk_up)) y -= 3
else if(keyboard_check(vk_down)) y += 3
image_angle = point_direction(xprevious,yprevious,x,y)
Sposób nie eliminuje jednego mankamentu, a mianowicie po zatrzymaniu się, gracz będzie zawsze zwrócony w prawo. Możesz to jednak wykluczyć używając pewnego warunku, ale to zrobisz już sam ^^