SDL - 鼠标输入

时间:2014-12-17 23:50:56

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

左侧鼠标似乎正在响应该事件,因为它更新了运动坐标。但是,如果我使用完全相同的代码但只使用SDL_BUTTON_RIGHT,则没有任何反应!就像SDL需要另一种理解鼠标右键的方式一样。我曾经使用过GLFW,SFML,GLUT,Qt,而且对于SDL而言,在grepping鼠标右键事件方面没有一致性令人眼花缭乱。我在这做错了什么?有没有一种正确的方式来处理我描述的方式的鼠标输入?如:

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

2 个答案:

答案 0 :(得分:4)

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

相反,请使用motion.state字段:

if(pEvent.type == SDL_MOUSEMOTION && pEvent.motion.state & SDL_BUTTON_LMASK)
    ...

答案 1 :(得分:0)

尝试替换:

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

由:

        if (pEvent.type == SDL_MOUSEMOTION && pEvent.button.button == SDL_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;
        }

我记得有那种“bug”回到我玩SDL的那一天(同样,如果你想要一个SDL的c ++包装,请查看SFML)