我正在尝试使用sdl作为openGL的窗口管理器。我考虑使用Windows本机API,但看起来令人困惑。
话虽如此,我有一个class Window
,我想立即将所有SDL内容包装到我的Windows管理中。如果我发现我不想使用SDL,那么它将让我以后换掉Windows管理。
我猜测很多openGL初始化代码只需要运行一次。
if(SDL_Init(SDL_INIT_EVERYTHING) < 0 ) {
exit(0x1);
}
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, 32);
SDL_GL_SetAttribute(SDL_GL_ACCUM_RED_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_ACCUM_GREEN_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_ACCUM_BLUE_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_ACCUM_ALPHA_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1);
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 2);
然后在类构造函数中,我可以使用
创建窗口Window::Window(int winW, int winH) {
if((Surf_Display = SDL_SetVideoMode(winW,winH,32, SDL_HWSURFACE | SDL_GL_DOUBLEBUFFER | SDL_OPENGL | SDL_RESIZABLE )) == NULL) {
exit(2);
}
glClearColor(0, 0, 0, 0);
glClearDepth(1.0f);
glViewport(0, 0, winW, winH);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, winW, winH, 0, 1, -1);
glMatrixMode(GL_MODELVIEW);
glEnable (GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glLoadIdentity();
}
我不知道该怎么做。如果我在标题中定义类之前放入代码,这是否达到了预期的结果?
;init code
;class window { };
答案 0 :(得分:1)
最简单的方法是将初始化代码放入函数中,然后从main
调用此函数:
/* header */
void init_window_management (void);
/* some source file */
void init_window_management (void) {
// your code
}
/* main file */
// ... also include that header ...
int main(int argc, char ** argv) {
// ...
init_window_management();
// ... use instances of the window class
}
然后还有std::call_once
。
如果我在标题中定义类之前放入代码,这是否会达到预期的效果?
没有。标头用于函数和类声明。执行(成员)函数的代码,然后通过main
函数调用(最终)。