gpt4 book ai didi

c++ - 使用鼠标单击与鼠标光标移动的回调时出现 OpenGL 未处理异常

转载 作者:搜寻专家 更新时间:2023-10-31 00:59:21 26 4
gpt4 key购买 nike

在提问之前,我会暴露部分代码,以便更好地解释。

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

我有我的 OpenGL :

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

我在哪里注册鼠标事件的回调

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()方法的内容,完全没有问题。

我什至可以正确地从 click() 中看到 printf 的

我看不出 move() 和 click() 方法之间有什么区别...

这里发生了什么?为什么仅当我使用 move() 时,glfwSwapBuffers(m_window); 才会出现崩溃?为什么不在 click() 中,因为两者的构造方式相同,使用它们各自的 callbacks

注意:我确实需要使用 move() 方法来“保存”鼠标坐标,以便稍后在 click() 方法中使用。

错误:

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

最佳答案

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

关于c++ - 使用鼠标单击与鼠标光标移动的回调时出现 OpenGL 未处理异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33506914/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com