SDL_GetRelativeMouseState奇怪的行为

时间:2014-08-29 21:20:30

标签: 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

  自上次调用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_GetMouseStateSDL_WarpMouse,但后者的功能似乎在某些平台上没有做任何事情。我正在使用Arch Linux + LXDE安装工作,这似乎完全忽略了鼠标扭曲。这是发生这种其他奇怪行为的机器。

问题是:为什么会发生这种情况,如何在保持相对鼠标模式的优势的同时解决兼容性问题呢?我甚至怀疑它是否可能成为SDL内部的一个问题。

2 个答案:

答案 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)时,它会直接跳到前一个坐标+ =运动。

这似乎比替代方案好很多,似乎。