在提出问题之前,我会公开部分代码以便更好地解释它。
我使用OpenGL 3.3
和GLFW
来处理来自鼠标的事件。
我有我的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.
答案 0 :(得分:4)
您正在将GLFW的用户指针设置为类this
对象的OpenGL
,但在回调中,您将其转换为类Mouse
。这些类之间也没有继承关系,因此通过该指针访问任何成员变量或方法会导致未定义的行为,在您的情况下表现为崩溃。