SDL logo

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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 = 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 = 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;
  }
}

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
g_nMouseDX += evt.motion.xrel;
g_nMouseDY += evt.motion.yrel;
g_nMouseDX += evt.motion.xrel; g_nMouseDY += evt.motion.yrel;
g_nMouseDX += evt.motion.xrel;
g_nMouseDY += evt.motion.yrel;

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