我在 SDL 2.0.3 中有一个应用程序,它在进入主游戏循环之前进入相对鼠标模式。此外,函数 mouse_input
在每一步被调用:
int mdltx = 0, mdlty = 0;
void mouse_input () {
auto r = SDL_GetRelativeMouseState(&mdltx, &mdlty);
if (mdltx != 0 || mdlty != 0)
cout << "(" << mdltx << "," << mdlty << ")" << endl;
// Update mouse key presses
mpul = !!(r&SDL_BUTTON(1)) | ((!!(r&SDL_BUTTON(3)))<<1);
}
根据documentation of SDL_GetRelativeMouseState
:
(...) x and y are set to the mouse deltas since the last call to SDL_GetRelativeMouseState() or since event initialization.
出于调试目的,我添加了输出行,因为在应用程序中产生的效果非常尴尬。事实证明,每次我移动鼠标(并且仅当我移动鼠标时),控制台都会打印出不合理范围内的值。下面是一个简单的鼠标移动示例。受影响的轴似乎是正确的(水平移动会将 mdlty
设置为 0,垂直移动会将 mdltx
设置为 0),但数字可能会比屏幕分辨率高得多,并且无论我移动鼠标的方向如何,它们都是正数。
(342,216)
(47290,0)
(23696,0)
(23730,0)
(23764,0)
(23799,0)
(71190,0)
(117970,83397)
(23491,41802)
(23457,0)
(23423,83811)
(0,41871)
(23389,208322)
(23355,82847)
(0,41320)
(46812,0)
我一直在网上寻找有同样问题的人,但没有成功。
另请注意,此应用程序之前是为 SDL 1 制作的,依赖于 SDL_GetMouseState
和 SDL_WarpMouse
,但后者的功能在某些平台上似乎没有任何作用。我正在 Arch Linux + LXDE 安装下开发应用程序,它似乎只是忽略了鼠标扭曲。这是发生其他奇怪行为的同一台机器。
问题是:为什么会发生这种情况,我如何在考虑兼容性的情况下修复它,同时保持相对鼠标模式的优势?我什至怀疑这是否是 SDL 本身的问题。
最佳答案
对于遇到此问题的其他人,设置可能会有所帮助:
SDL_SetHintWithPriority(SDL_HINT_MOUSE_RELATIVE_MODE_WARP, "1", SDL_HINT_OVERRIDE);
SDL_SetRelativeMouseMode(SDL_TRUE);
这似乎为您提供了相对的鼠标输出,其中屏幕中心为 (0,0)。
但是对我来说,它目前没有正确地重置光标坐标,所以虽然每一帧都将其重置为 (0,0),但它会直接跳转到前一个坐标 += 移动。
不过,这似乎比替代方案要好得多。
关于c++ - SDL_GetRelativeMouseState 奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25576438/