SDL - 鼠标输入

Por*_*ous 2 c++ sdl

我已经阅读了有关鼠标事件的文档,并且也阅读了有关鼠标输入处理的教程。尽管如此,这个问题仍然存在:

我有一个相机和一个 opengl 上下文,我只是希望如果鼠标移动并单击鼠标左键,相机就会旋转。所以,很自然地我写了这段代码:

void processEvents()
{
    float deltaX = 0;
    float deltaY = 0;

    while (SDL_PollEvent(&pEvent) != 0)
    {
        if (pEvent.type == SDL_QUIT)
            pApp_isRunning = false;

        if (pEvent.type == SDL_MOUSEMOTION && pEvent.button.button == SDL_BUTTON_LEFT)
        {
            deltaX += pEvent.motion.x;
            deltaY += pEvent.motion.y;
            pCamera.rotate(deltaX / REFRESH_RATE, deltaY / REFRESH_RATE);

            cout << "Mouse = (" << deltaX << ", " << deltaY << ")" << endl;
        }

        if (pEvent.type == SDL_MOUSEMOTION && pEvent.button.button == SDL_BUTTON_RIGHT)
        {
            deltaX += pEvent.motion.x;
            deltaY += pEvent.motion.y;
            pCamera.rotate(deltaX / REFRESH_RATE, deltaY / REFRESH_RATE);

            cout << "Mouse = (" << deltaX << ", " << deltaY << ")" << endl;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

鼠标左键似乎正在响应该事件,因为它更新了运动坐标。但是,如果我使用完全相同的代码但仅使用 SDL_BUTTON_RIGHT,则什么也不会发生!就好像 SDL 需要另一种方式来理解鼠标右键。我曾使用过 GLFW、SFML、GLUT、Qt,并且 SDL 在 grep 鼠标右键事件方面没有一致性,这在我看来是令人眼花缭乱的。我在这里做错了什么?是否有按照我描述的方式处理鼠标输入的正确方法?如:

如果单击鼠标左键并且鼠标已移动:旋转相机。如果单击鼠标右键并且鼠标已移动:旋转相机。我一定在这里遗漏了一些东西,或者可能是 SDL2 的一个错误。

Jon*_*y D 5

这里有一个常见的错误。SDL_Event 是一个联合,因此如果您已检查类型为 SDL_MOUSEMOTION,则不应使用 event.button 字段。换句话说,您正在调用未定义的行为,这不是 SDL 和鼠标右键的问题。

相反,使用 Motion.state 字段:

if(pEvent.type == SDL_MOUSEMOTION && pEvent.motion.state & SDL_BUTTON_LMASK)
    ...
Run Code Online (Sandbox Code Playgroud)