2015-07-01 2 views
0

Я пытаюсь использовать sdl в качестве диспетчера окон для openGL. Я изучил использование собственного API-интерфейса Windows, но выглядел запутанным.Выполнить код класса один раз C++

С учетом сказанного, у меня есть class Window, который я бы хотел сейчас обернуть весь материал SDL для моего управления окнами. Рисунок, это позволит мне менять управление окнами позже, если я нахожу, что я не хочу использовать SDL.

Я предполагаю, что много кода инициализации 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

Проще всего было бы поместить этот код инициализации в функцию а просто вызвать эту функцию из 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.

Если я поместил код до того, как я определю класс в заголовке, достигнет ли он желаемого результата?

No. Заголовок предназначен для объявлений функций и классов. Код для выполнения функций жизни (член), затем они вызываются (в конечном счете) через функцию main.

+0

Хорошо, я просто подумал, что странно иметь класс, требующий некоторой инициализации в основном, но, вероятно, лучший выбор. Благодарю. – Chemistpp

Смежные вопросы