SDL logo

По своей глупости нарвался на ошибку. Есть обработчик ивентов (клавиатура, мышь, джойстик), у мыши кроме состояния кнопок есть еще координаты и смещение относительно последней выборки. Код выглядит приблизительно так:

g_nMouseDX = 0;
g_nMouseDY = 0;

SDL_Event evt;
while(SDL_PollEvent(&evt))
{
  switch(evt.type)
  {
  case SDL_MOUSEMOTION:
    g_nMouseDX += evt.motion.xrel;
    g_nMouseDY += evt.motion.yrel;
    break;
  }
}

Так вот, моя ошибка была тут:

g_nMouseDX += evt.motion.xrel;
g_nMouseDY += evt.motion.yrel;

Я просто не учитывал, что при выполнении этого кода на медленном компьютере, ивентов за каждый фрейм может приходить более одного. И по этой причине я терял данные о смещении мыши. Простая замена присвоения “=” на добавление “+=” решило проблему.