【问题标题】:SDL - Mouse inputSDL - 鼠标输入
【发布时间】:2014-12-18 08:17:40
【问题描述】:

我已经阅读了有关鼠标事件的文档,并且还阅读了有关鼠标输入处理的教程。不过,这个问题依然存在:

我有一个相机和一个 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 鼠标右键事件方面没有一致性是令人眼花缭乱的 imo。我在这里做错了什么?有没有按照我描述的方式处理鼠标输入的正确方法?如:

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

【问题讨论】:

    标签: c++ sdl


    【解决方案1】:

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

    改为使用 motion.state 字段:

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

    【讨论】:

      【解决方案2】:

      尝试替换:

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

      我记得在我玩 SDL 的那一天有过这种“错误”(另外,如果你想要 SDL 的 c++ 包装器,请检查 SFML)

      【讨论】:

      • 谢谢,这似乎解决了我的问题。你也知道 SDL 上的鼠标滚动吗?我使用了 if (pEvent.type == SDL_MOUSEWHEEL) 并简单地将 pEvent.wheel.y 添加到 deltaY。虽然 deltaY(和 deltaX)在上升时被初始化为 (0, 1),或者相反的 (0, -1)。这是预期的吗?
      • 很高兴它有帮助,记得将我的答案标记为已接受!对于轮子,我建议创建另一个问题。但是是的,我认为这是预期的行为,因为从右向左滚动时将使用 X。 (一些鼠标允许移动)
      • 这不是对 SDL_BUTTON 宏的正确使用......如果它有效,那么它只是隐藏了真正的问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多