нужно отделить рендерера от управлятора. при получении событий пересчитываем координаты , но не рендерим. каждые 20мс вызываем рендер, который забирает координаты и рисует картинку
далее, если ты вешаешься на keypress, то это плохая затея. нужно при keydown включать движение, а по keyup выключать. и включённом, допустим, каждые 10 мс инкрементировать