It's using 8direction.speed in events 3-6 when setting the offset. That's fine when only moving in one direction but when going diagonal it's too fast. You should use vectorX and vectorY instead.
I won't salvage that example though. One every tick event should do it. The first part sets the offset and the second part corrects it when negative because of how % works.
every tick
set x offset to (Self.ImageOffsetX + Player.8Direction.vectorX* dt) % Self.ImageWidth
set y offset to (Self.ImageOffsetY + Player.8Direction.vectorY* dt) % Self.ImageHeight
set x offset to Self.ImageOffsetX<0?Self.ImageOffsetX+Self.ImageWidth:Self.ImageOffsetX
set y offset to Self.ImageOffsetY<0?Self.ImageOffsetY+Self.ImageHeight:Self.ImageOffsetY