一旦C ++执行类代码

时间:2015-07-01 01:55:53

标签: c++ class opengl

我正在尝试使用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 { };

1 个答案:

答案 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函数调用(最终)。