Итак, я пытаюсь использовать аналоговый джойстик на геймпаде для перемещения курсора мыши на рабочем столе. Проблема в том, что мне нужно получить ту же плавность, что и в Попытке 2, но без использования абсолютного положения мыши. Курсор необходимо переместить относительно его текущей позиции. Причина этого в том, что многие приложения (в основном видеоигры) также устанавливают абсолютную позицию мыши. Это заставляет приложение и попытку 2 бороться друг с другом за контроль над мышью.
Попытка 1 (относительная)
// keep updating the controller state and mouse position
while (true)
{
// getState returns a 2d float vector with normalized values from [-1, 1]
// The cursor is being set relative to its current position here.
SetCursorPosition(GetCursorPosition() + analogStick->getState());
}
Это решение работает, но страдает от проблемы с округлением, поскольку GetCursorPosition и SetCursorPosition основаны на целых числах. В результате небольшие движения не регистрируются, потому что меньшие аналоговые движения всегда будут усечены. Наглядно говоря, небольшие движения аналогового джойстика будут перемещать мышь только по оси X или Y, даже если вы попытаетесь сделать диагональное движение.
Попытка 2 (абсолютная)
vec2 mouseTargetPosition = GetCursorPosition(); // global cursor position
while (true)
{
mouseTargetPosition += leftStick->getState();
vec2 newPosition = lerp(GetCursorPos(), mouseTargetPosition, 0.8f);
SetCursorPos(round(newPosition.x), round(newPosition.y));
}
Это решение отлично работает, мышь реагирует на малейшие движения и движется очень естественно в результате интерполяции накопленных аналоговых движений. Но он устанавливает мышь в абсолютное положение (mouseTargetPosition), что делает это решение нарушающим условия сделки.