3

我正在用 OpenGL 为学校编写游戏。由于会有更多类似的任务,我想制作一个小框架来在 OpenGL 中做常见的事情。我之前做过一些简单的游戏,我通常把它分解成一个 IO 类来处理输入和绘制到屏幕上,用于主游戏循环/逻辑的 Game 类,以及用于游戏中任何对象的类。

在我使用 SDL 之前,我的问题是,这是在 OpenGL 中进行此操作的正确方法吗?我已经遇到了一些麻烦。我希望我的 IO 类能够处理初始化窗口、绘制场景和单击鼠标。所以构造函数看起来像这样:

IO::IO()
{
    currWindowSize[0] = DEF_WIDTH;
    currWindowSize[1] = DEF_HEIGHT;

    glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGBA );
    glutInitWindowPosition( INIT_WINDOW_POSITION[0], INIT_WINDOW_POSITION[1] );
    glutInitWindowSize( currWindowSize[0], currWindowSize[1] );
    glutCreateWindow( "TEST" );

    setUp();

    glutDisplayFunc(drawScene);
    glutMainLoop();
}

但是,drawScene是一个类方法。有没有办法将类方法传递给glutDisplayFunc()而不使其成为静态?

4

3 回答 3

3

不幸的是,glutDisplayFunc()它没有void*指针,所以你可以伪造一个对象上下文。您必须创建一个静态函数,该函数可以使用静态变量调用正确的 IO 实例。

不过,我也看到你的模式有一些小问题。据我所知,glutMainLoop()在终止 GLUT 上下文之前永远不会返回,因此您有一个实际上永远不会返回的构造函数,因此您的程序流程是不合理的。您应该将该调用移至run()类中的单独方法中。

(我个人会使用 GLFW,它避免了整个回调与 GLUT 的混乱,尽管你必须编写你的主循环。)

于 2010-01-24T23:45:27.070 回答
2

两点,

首先,glutMainLoop 永远不会返回,并开始发送消息。因为您从构造函数中调用了它,所以您的类可能尚未正确构造。此外 glut 确实支持多个窗口,并且 glutModalLoop 只需要调用一次。

其次,正如您所指出的,传递给 glutDisplayFunc 的方法必须是静态的。您将需要一个将过剩窗口 ID 与 IO 指针相关联的静态数组。当一个 IO 实例调用 glutCreateWindow 时,将返回的 id 和 IO 实例存储在数组中。每当调用静态 drawScene 时,您都会调用 glutGetWindow 来获取当前窗口的 id,并查找关联的 IO 指针并调用非静态 drawScene 实现。

于 2010-01-25T22:10:18.313 回答
0

在我使用 SDL 之前,我的问题是,这是在 OpenGL 中进行此操作的正确方法吗?

我宁愿完全绕过 GLUT(如果你想了解 OpenGL 的内部结构和你的操作系统窗口系统界面)。iPhone 不支持 Plus GLUT(如果您将来想针对此平台)。

所以这个想法是WGL在 Windows、GLXLinux 和CGLOS X 上使用。

于 2010-01-25T00:09:21.023 回答