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

Using GLFW to capture mouse dragging? [C++]

本文关键字:C++ 拖动 鼠标 GLFW 使用      更新时间:2023-10-16

所以我试图在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;
        }
    }
}

但问题是,如果我想放大,我需要向上移动鼠标,然后重复单击。出于某种原因,如果我按下鼠标左键并向上拖动,它不会起任何作用。

在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`
}

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

最困难的方法是使用状态机(尤其是当您需要更复杂的输入控制器状态组合时)。