0
好的,所以我嘗試使用遊戲板上的模擬杆來移動桌面鼠標光標。問題是我需要能夠獲得與嘗試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),從而使該解決方案成爲交易斷路器。