2015-11-03 60 views
2

在提出問題之前,我將公開部分代碼以更好地解釋它。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!! 
} 

正如你所看到的,我有處理鼠標事件鼠標類:

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's

我看到了move()和點擊()方法沒有差別......

這到底是怎麼回事?爲什麼只有當我使用move()時,崩潰纔出現在glfwSwapBuffers(m_window);上?爲什麼不在click()中,因爲兩者的構造方式都是相同的,分別使用它們的callbacks

注:我需要使用move()方法,「拯救」鼠標座標,到後來上使用,在click()方法。

的錯誤:

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

回答

4

您GLFW的用戶指針設置爲OpenGL類的對象的this,但在你的回調,可以將其轉換爲Mouse類。這些類之間也沒有繼承關係,因此通過該指針訪問任何成員變量或方法會導致未定義的行爲,這表現爲您的情況下崩潰。

+0

謝謝@derhass :)你是對的! – waas1919