如何创建一个包装GLUT的类?

时间:2010-01-24 23:33:06

标签: c++ glut

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

在我使用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()而不使其成为静态?

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

两点,

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

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

答案 2 :(得分:0)

  

在我使用SDL之前,所以我的问题   是,这是正确的方式   关于OpenGL中的这个?

我宁愿完全绕过GLUT(如果你想学习OpenGL和你的OS窗口系统界面的内心)。 iPhone上不支持GLUT(如果您希望将来定位此平台)。

因此,我们的想法是在Windows上使用WGL,在Linux上使用GLX,在OS X上使用CGL