SDL_GetRelativeMouseState的奇怪行为

SDL_GetRelativeMouseState strange behaviour

本文关键字:GetRelativeMouseState SDL      更新时间:2023-10-16

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);
}

根据SDL_GetRelativeMouseState:文件

(…)xy设置为自上次调用SDL_GetRelativeMouseState()或自事件初始化以来的鼠标增量。

我添加输出行是为了调试,因为在应用程序中产生的效果非常尴尬。事实证明,每次我移动鼠标(只有当我移动鼠标时),控制台都会打印不合理范围内的值。下面是一个简单的鼠标移动示例。受影响的轴似乎是正确的(水平移动会将mdlty设置为0,垂直移动会将mdltx设置为0),但这些数字可能会比屏幕分辨率高得多,而且无论我移动鼠标的方向如何,它们都是正的。


(342216)

(47290,0)

(23696.0)

(23730,0)

(23764,0)

(23799,0)

(71190,0)

(11797083397)

(2349141802)

(23457,0)

(2342383811)

(041871)

(23389208322)

(2335582847)

(041320)

(46812.0)


我一直在网上寻找有同样问题的人,但没有成功。还要注意的是,这个应用程序以前是为SDL 1制作的,依赖于SDL_GetMouseStateSDL_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)时,它会直接跳到上一个坐标+=移动。

不过,这似乎比其他选择要好得多。

相同的代码在不同的机器上工作,所以这似乎是一个错误。似乎有些人也发现了这一点,他们的不当行为范围比提到的更广。https://bugzilla.libsdl.org/show_bug.cgi?id=2150

相关文章:
  • 没有找到相关文章