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