c++ - SDL_GetRelativeMouseState 奇怪的行为

标签 c++ sdl-2

我在 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_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),但它会直接跳转到前一个坐标 += 移动。

不过,这似乎比替代方案要好得多。

关于c++ - SDL_GetRelativeMouseState 奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25576438/

相关文章:

c++ - 尝试编译此代码时遇到问题

c++ - move unique_ptr<T> 的 vector

c++ - 将 vector 用于背包算法时抛出错误分配

c++ - 如何使用 SDL_surface 在用户定义的矩形上显示图像?

c++ - SDL: Blitting BMP to window surface 黑屏之谜

c++ - TinyXml Unresolved external 问题

c++ - std::set 自定义比较器用于 2D 点

c - 我需要 SDL 的 main() 函数吗?

c - 检测到我的角色与物体发生碰撞后,角色无法再移动?

无法通过双击运行 SDL2 可执行文件