Когда вы SDL_WarpMouse
, генерируется другое событие перемещения мыши, которое вы обрабатываете снова. Вы должны игнорировать второй.
Чтобы усложнить ситуацию, не обязательно, чтобы за каждым событием движения следовало одно в противоположном направлении, вызванное SDL_WarpMouse
. К событиям могут относиться, например, два движения и 1, сгенерированные деформацией, к середине экрана. Я написал этот код, который работает для меня:
void motion(SDL_MouseMotionEvent *mme)
{
static bool initializing = true; // For the first time
static int warpMotionX = 0, warpMotionY = 0; // accumulated warp motion
if (initializing)
{
if (mme->x == midWindowX && mme->y == midWindowY)
initializing = false;
else
SDL_WarpMouse(midWindowX, midWindowY);
}
else if (mme->xrel != -warpMotionX || mme->yrel != -warpMotionY)
{
/****** Mouse moved by mme->xrel and mme->yrel ******/
warpMotionX += mme->xrel;
warpMotionY += mme->yrel;
SDL_WarpMouse(midWindowX, midWindowY);
}
else // if event motion was negative of accumulated previous moves,
// then it is generated by SDL_WarpMotion
warpMotionX = warpMotionY = 0;
}
void processEvents()
{
SDL_Event e;
while (SDL_PollEvent(&e))
{
switch (e.type)
{
case SDL_MOUSEMOTION:
motion(&e.motion);
break;
default:
break;
}
}
}
Обратите внимание, что я сам интересуюсь -mme->yrel
, чем mme->yrel
, и поэтому именно в исходном коде он отменяется везде, где я его использую (я удалил его в коде, который я разместил выше)
Где я написал /****** Mouse moved by mme->xrel and mme->yrel ******/
- это место, где вы хотите воздействовать на движение мыши. Другой код должен игнорировать движение, генерируемое SDL_WarpMouse