使用GLFW捕获鼠标拖动? [C ++]

时间:2016-05-12 18:31:27

标签: c++ opengl glfw

所以我试图在我的OpenGL应用程序中捕获鼠标拖动。到目前为止,我已完成以下任务:

glfwSetMouseButtonCallback(window, mouse_callback);

static void mouse_callback(GLFWwindow* window, int button, int action, int mods)
{
    if (button == GLFW_MOUSE_BUTTON_LEFT) {
        double x;
        double y;
        glfwGetCursorPos(window, &x, &y);

        if (previous_y_position - y > 0)
        {
            camera_translation.y -= 1.0f;
            previous_y_position = y;
        }
        else
        {
            camera_translation.y += 1.0f;
            previous_y_position = y;
        }
    }
}

这个问题是,如果我想放大,我需要向上移动鼠标,然后反复点击。出于某种原因,如果我按下鼠标左键并向上拖动它什么都不做。

2 个答案:

答案 0 :(得分:2)

mouse_callback是无国籍的。它接收事件,瞬间"行动"。 你需要让你的程序记住"记住"按下鼠标按钮。因此,当在第1帧中按下按钮时,您可以在此之后和释放鼠标按钮之前的所有帧中引用此信息。

简单的方法是在按下/释放时翻转布尔标志:

static void mouse_callback(GLFWwindow* window, int button, int action, int mods)
{
    if (button == GLFW_MOUSE_BUTTON_LEFT) {
        if(GLFW_PRESS == action)
            lbutton_down = true;
        else if(GLFW_RELEASE == action)
            lbutton_down = false;
    }

    if(lbutton_down) {
         // do your drag here
    }
}

示意性地:

state                  released               pressed                released
timeline             -------------|------------------------------|---------------
                                  ^                              ^
mouse_callback calls          GLFW_PRESS                    GLFW_RELEASE

困难的方法是使用状态机(特别是如果您需要更复杂的输入控制器状态组合)。

答案 1 :(得分:1)

在cursor_pos_callback中,只需确认按钮是否按下,即可。

void mouse_cursor_callback( GLFWwindow * window, double xpos, double ypos)  
{

  if (glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_LEFT) == GLFW_RELEASE) 
  {
     return;
  }

  // `write your drag code here`
}