Yeah this is easy enough. On pressing a direction, set an alterable value of that object to the numerical value equivalent to that direction (right=0, up=8, left=16, down=24). Then compare the current direction to this value and rotate towards it in the direction that would take it there closest, either with a couple of events or the Direction Calculator extension.
Here's a method that uses the direction calculator. My version did it without any extensions, but I can't be arsed remembering how exactly:
Keyboard: pressed right
---Active: set alterable value A to 0
Keyboard: pressed up
---Active: set alterable value A to 8
Keyboard: pressed left
---Active: set alterable value A to 16
Keyboard: pressed down
---Active: set alterable value A to 24
[Do the same thing for diagonals if you like]
Direction("Active") <> Alterable Value A("Active")
---Direction Calculator: rotate Active towards direction Alterable Value A("Active")
There, easy. Pretty sure that would work. For the actual movement of Active, either use a custom movement or always set Active to the position of an invisible object with 8-directional movement (or set it to the position of an invisible one with custom movement, which would be ideal for collision detection).