2016-09-18 2 views
1

Я следую учебнику Lazy Foo на C++ и SDL2. Я пытаюсь изучить его с помощью обычного C и заметил что-то интересное, следуя инструкциям по добавлению событий для обнаружения события закрытого окна.Не удается закрыть окно

Вот код.

#include <stdio.h> 
#include <stdbool.h> 
#include "SDL2/SDL.h" 

bool init(); 
bool loadMedia(); 
void close(); 

const int SCREEN_WIDTH = 640; 
const int SCREEN_HEIGHT = 480; 

SDL_Window *gWindow = NULL; 
SDL_Surface *gScreenSurface = NULL; 
SDL_Surface *gHelloWorld = NULL; 

int main(int argc, char *argv[]) 
{ 
    if(!init()) { 
     printf("Failed to initialize!\n"); 
    } 
    else { 
     if(!loadMedia()) { 
      printf("Failed to load media!\n"); 
     } 
     else { 
      bool quit = false; 
      SDL_Event e; 

      while(!quit) { 
       printf("%d", SDL_PollEvent(&e)); 

       while(SDL_PollEvent(&e) != 0) { 
        if(e.type == SDL_QUIT) { 
         quit = true; 
        } 
       } 

       SDL_BlitSurface(gHelloWorld, NULL, gScreenSurface, NULL); 
       SDL_UpdateWindowSurface(gWindow); 
      } 
     } 
    }  

    close(); 

    return 0; 
} 

bool init() 
{ 
    bool success = true; 

    if(SDL_Init(SDL_INIT_VIDEO) < 0) { 
     printf("SDL could not initialize! SDL_Error: %s\n", SDL_GetError()); 
     success = false; 
    } 
    else { 
     gWindow = SDL_CreateWindow("SDL Tutorial 03", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN); 

     if(gWindow == NULL) { 
      printf("Window could not be created! SDL_Error: %s\n", SDL_GetError()); 
      success = false; 
     } 
     else { 
      gScreenSurface = SDL_GetWindowSurface(gWindow); 
     } 
    } 

    return success; 
} 

bool loadMedia() 
{ 
    bool success = true; 

    gHelloWorld = SDL_LoadBMP("images/hello_world.bmp"); 

    if(gHelloWorld == NULL) { 
     printf("Unable to load image %s! SDL_Error: %s\n", "images/hello_world.bmp", SDL_GetError()); 
     success = false; 
    } 

    return success; 
} 

void close() 
{ 
    SDL_FreeSurface(gHelloWorld); 
    gHelloWorld = NULL; 

    SDL_DestroyWindow(gWindow); 
    gWindow = NULL; 

    SDL_Quit(); 
} 

Если я компилирую это с расширением «.c», он компилируется без ошибок, но выбирая „X“ на строке заголовка окна ничего не делает. Если я изменил расширение на «.cpp», «X» будет работать по назначению.

Я использую следующую команду для компиляции кода.

gcc main.c -w -lSDL2 -o main 

Любые идеи, почему это может работать с C++, но не с C?

+4

будет ли проблема с областью с вызовом 'close()'? можете ли вы проверить предупреждения (вместо того, чтобы игнорировать их с помощью '-w')? Бьюсь об заклад, они упоминают 'close' в командной строке C. –

+1

'Я сказал компилятору, чтобы он не сказал мне, если материал был сломан (-w), может ли кто-нибудь сказать мне, почему материал сломан?' – kfsone

+0

К сожалению, это была команда, которую посоветовали использовать. Если я удалю «-w», никаких дополнительных ошибок я не получу. – azurepancake

ответ

2

Функция SDL_PollEvent удалит событие из внутренней очереди событий, если к нему передан адрес объекта SDL_event.

Вызов printf, который также вызывает функцию SDL_PollEvent, перед циклом события, который удаляет событие quit из очереди. Это означает, что цикл обработки событий не найти это событие:

printf("%d", SDL_PollEvent(&e)); 

while(SDL_PollEvent(&e) != 0) { 
    if(e.type == SDL_QUIT) { 
     quit = true; 
    } 
} 

Если вы хотите, чтобы проверить, есть ли события ожидающие в очереди, а затем использовать функцию SDL_PollEvent с аргументом NULL:

printf("%d", SDL_PollEvent(NULL)); 
Смежные вопросы