2015-07-22 3 views
2

Так что я хочу, чтобы этот код создавал окно с изображением на нем (hello world), а затем вышло после 5 секунд, используя SDL2, визуальную студию и C++. Я думал, что это должно быть достаточно просто. Я написал код, и когда я его построил, ошибок не было, однако проблема заключается в том, что окно завершается, как только оно создается. Я думал, что добавление SDL_Delay (5000) приведет к желаемому эффекту, но я думаю, что это не сработало. Может ли кто-нибудь сказать мне, почему это так?Окно закрывается слишком быстро

#include <SDL.h> 
#include <iostream> 

bool init(); 
bool load_media(); 
void close(); 
const int s_height = 300; 
const int s_width = 400; 

SDL_Window* new_window = NULL; 
SDL_Surface* new_surface = NULL; 
SDL_Surface* new_image = NULL; 

using namespace std; 

bool init() 
{ 
    bool success = true; 
    if (SDL_Init(SDL_INIT_VIDEO) < 0) 
    { 
     cout << "couldn't initialize" << endl; 
     success = false; 
    } 
    else 
    { 
     new_window = SDL_CreateWindow(
      "SDL Tutorial 2", 
      SDL_WINDOWPOS_UNDEFINED, 
      SDL_WINDOWPOS_UNDEFINED, 
      s_width, 
      s_height, 
      SDL_WINDOW_SHOWN); 
     if (new_window == NULL) 
     { 
      cout << "there's no window" << endl; 
      success = false; 
     } 
     else 
     { 
      new_surface = SDL_GetWindowSurface(new_window); 
     } 

    } 
    return success; 
} 

bool load_media() 
{ 
    bool success = true; 
    new_image = SDL_LoadBMP("SDL Tutorial 2/hello_world.bmp"); 
    if (new_image == NULL) 
    { 
     cout << "couldn't load image" << endl; 
     success = false; 
    } 
    return success; 
} 

void close() 
{ 
    SDL_FreeSurface(new_image); 
    SDL_DestroyWindow(new_window); 
    SDL_Quit; 

} 


int main(int argc, char *argv[]) 
{ 
    if (!init()) 
    { 
     cout << "FAILED to Initialize!" << endl; 
     if (!load_media()) 
     { 
      cout << "FAILED to Load Media!" << endl; 
     } 
     else 
     { 
      SDL_BlitSurface(new_image, NULL, new_surface, NULL); 
      SDL_UpdateWindowSurface(new_window); 
      SDL_Delay(5000); 
      SDL_Quit; 
     } 
    } 

close(); 
return 0; 
} 
+0

Этот код компилируется без warnigs? SDL_Quit не имеет круглых скобок. – nsilent22

+0

Это верно, этот код компилируется без ошибок –

+1

Возможно, вы компилируете без каких-либо предупреждений, но SDL_Quit; просто утверждение без эффекта. Кроме того, если он был правильно вызван, вы бы назвали его дважды, что не очень хорошо (один раз в 'main', второй раз в' close'). Последнее: 'close' не является хорошим именем для функции, так как в стандартной библиотеке есть одна и та же именованная функция. – nsilent22

ответ

1

Здесь у вас есть код, который работает со всеми предложениями от комментариев и другие ответы:

#include <SDL.h> 
#include <iostream> 

int const s_height = 300; 
int const s_width = 400; 

SDL_Window *new_window = NULL; 
SDL_Surface *new_surface = NULL; 
SDL_Surface *new_image = NULL; 

using namespace std; 

bool init(void) { 
    if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) < 0) { 
     cout << "couldn't initialize" << endl; 
     return false; 
    } 
    new_window = SDL_CreateWindow("SDL Tutorial 2", 
            SDL_WINDOWPOS_UNDEFINED, 
            SDL_WINDOWPOS_UNDEFINED, 
            s_width, 
            s_height, 
            SDL_WINDOW_SHOWN 
    ); 
    if (new_window == NULL) { 
     cout << "there's no window" << endl; 
     return false; 
    } 

    new_surface = SDL_GetWindowSurface(new_window); 
    if (new_surface == NULL) { 
     cout << "there's no surface" << endl; 
     return false; 
    } 
    return true; 
} 

bool load_media(void) { 
    new_image = SDL_LoadBMP("SDL Tutorial 2/hello_world.bmp"); 
    if (new_image == NULL) { 
     cout << "couldn't load image" << endl; 
     return false; 
    } 
    return true; 
} 

void finish(void) { 
    if (new_image) { 
     SDL_FreeSurface(new_image); 
    } 
    if (new_window) { 
     SDL_DestroyWindow(new_window); 
    } 
    SDL_Quit(); 
} 

int main(int argc, char *argv[]) { 
    if (init()) { 
     if (load_media()) { 
      SDL_BlitSurface(new_image, NULL, new_surface, NULL); 
      SDL_UpdateWindowSurface(new_window); 
      SDL_Delay(5000); 
      finish(); 
     } else { 
      cout << "FAILED to Load Media!" << endl; 
     } 
    } else { 
     cout << "FAILED to Initialize!" << endl; 
    } 
    return 0; 
} 
2

Вы только инициализировали Подсистему видео; вам нужно инициализировать подсистему Timer, если вы хотите использовать SDL_Delay и другие связанные с этим функции.

Измените ваш SDL_Init(SDL_INIT_VIDEO) на SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER)

2

Ваша первая линия должна быть ...

if (init()) 

вызова 'если (! Init())' продолжается до остальной части кода только в том случае инициализации() выходит из строя. Я думаю, что окно на короткое время появляется, потому что в init() окно создается, но остальная часть вашего кода (включая синхронизацию) пропускается, и окно сразу закрывается.

Я хотел бы пересмотреть, чтобы:

int main(int argc, char* argv[]) 
{ 
    if(init()) { 

     //other code executes if init() is successful 
     SDL_Delay(5000); 
    } 

    else { 
     cout << "Failed to initialize!"; 
    } 

    close(); 
    return 0; 
} 
Смежные вопросы