使用鼠标点击与鼠标光标移动回调时的OpenGL未处理异常

时间:2015-11-03 18:55:05

标签: c++ opengl

在提出问题之前,我会公开部分代码以便更好地解释它。

我使用OpenGL 3.3GLFW来处理来自鼠标的事件。

我有我的OpenGL class

class OpenGL
{
public:
    OpenGL();
    ~OpenGL();

private:
    //(...)
    void registerCallBacks();

    static void mouseMove(GLFWwindow* window, double xpos, double ypos);
    static void mouseClick(GLFWwindow* window, int button, int action, int mods);

    GLFWwindow*     m_window;
};

我为鼠标事件注册callbacks

void OpenGL::registerCallBacks()
{
    glfwSetWindowUserPointer(m_window, this);

    glfwSetCursorPosCallback(m_window, mouseMove);
    glfwSetMouseButtonCallback(m_window, mouseClick);
}

从回调中调用的方法是这些(在头文件上是static):

void OpenGL::mouseMove(GLFWwindow* window, double xpos, double ypos)
{
    void* userPointer = glfwGetWindowUserPointer(window);
    Mouse* mousePointer = static_cast<Mouse*>(userPointer);
    mousePointer->move(xpos,ypos); //EXECUTE MOVE AND CRASH on glfwSwapBuffers()
}

void OpenGL::mouseClick(GLFWwindow* window, int button, int action, int mods)
{
    void* userPointer = glfwGetWindowUserPointer(window);  
    Mouse* mousePointer = static_cast<Mouse*>(userPointer);
    mousePointer->click(button,action); //EXECUTE CLICK AND IT'S OK!!
}

如您所见,我有一个处理鼠标事件的Mouse类:

class Mouse
{
public:
    Mouse();

    ~Mouse();

    void click(const int button, const int action); //called from the mouseClick() in the OpenGL class
    void move(const double x, const double y); //called from the mouseMove()  in the OpenGL class

private:
    double m_x;
    double m_y;
};

move方法仅限于此:

void Mouse::move(const double x, const double y)
{
    m_x = x;
    m_y = y;
}

click方法只有这个:

void Mouse::click(const int button, const int action)
{
    printf("button:%d, action:%d\n",button, action);
}

我的问题/疑问是:

我的openGL主循环在循环结束时有glfwSwapBuffers(m_window);,如果我使用上面显示的Mouse::move()方法,它将在此行崩溃。 如果我评论move()方法的内容,则完全没有问题。

我甚至可以正确地看到printf's中的click()

我认为move()和click()方法之间没有区别......

这里发生了什么?为什么只有在我使用glfwSwapBuffers(m_window);时才会在move()上显示崩溃?为什么不在click()中,因为两者都以相同的方式构建,使用各自的callbacks

注意:我确实需要使用move()方法来保存&#34;稍后在click()方法上使用的鼠标坐标。

错误:

Unhandled exception at 0x001F2F14 in TheGame.exe: 0xC0000005: Access violation reading location 0x4072822C.

1 个答案:

答案 0 :(得分:4)

您正在将GLFW的用户指针设置为类this对象的OpenGL,但在回调中,您将其转换为类Mouse。这些类之间也没有继承关系,因此通过该指针访问任何成员变量或方法会导致未定义的行为,在您的情况下表现为崩溃。