好的,所以我正在尝试使用游戏板上的模拟摇杆来移动桌面鼠标光标。问题是我需要能够获得与尝试 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),使这个解决方案成为一个交易破坏者。