Почему персонаж так быстро двигается?
Просто возьми и используй PointJS.
Зачем ты сам возишься со всеми этими мелочами? 
Если системно - у тебя изначально подход не правильный.  Цикл игры должен крутится непрерывно, а не запускать по нажатию. По нажатию должны только меняться векторы объекта, а в цикле игры ты должен измерять задержку между кадрами и пересчитывать смещение по вектору в зависимости от этой задержки.
Ну setTimeout же.