我在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
:
自上次调用SDL_GetRelativeMouseState()或自事件初始化以来,(...) x 和 y 设置为鼠标增量。
我已经添加了输出行以进行调试,因为在应用程序中产生的效果非常尴尬。事实证明,每次我移动鼠标(并且只有当我移动鼠标时),控制台才会在不合理的范围内打印值。以下是进行简单鼠标移动的示例。受影响的轴看起来是正确的(水平移动会将mdlty
设置为0,垂直移动会将mdltx
设置为0),但数字可以远高于屏幕分辨率,并且所有数字都是正数,无论我移动鼠标的方向如何。
(342216)
(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内部的一个问题。
答案 0 :(得分:1)
相同的代码在不同的机器上工作,所以这似乎是一个错误。似乎有些人也发现了这种情况,其中的错误行为比上面提到的更广泛。 https://bugzilla.libsdl.org/show_bug.cgi?id=2150
答案 1 :(得分:1)
对于其他任何正在努力解决此问题的人来说,设置可能会有所帮助:
SDL_SetHintWithPriority(SDL_HINT_MOUSE_RELATIVE_MODE_WARP, "1", SDL_HINT_OVERRIDE);
SDL_SetRelativeMouseMode(SDL_TRUE);
这似乎给你相对鼠标输出,其中屏幕的中心是(0,0)。
然而对我而言,它目前还没有正确地重置Cursor坐标,所以当每一帧将其重置为(0,0)时,它会直接跳到前一个坐标+ =运动。
这似乎比替代方案好很多,似乎。