2016-09-18 126 views
1

我正在關注C++和SDL2上的Lazy Foo教程。我試圖用普通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'忽略它們)嗎?我敢打賭,他們在C命令行中提到了「close」。 –

+1

'我告訴編譯器不要告訴我東西是否壞了(-w),誰能告訴我爲什麼東西壞了?' – kfsone

+0

對不起,這是教程建議使用的命令。如果我刪除「-w」,則不會出現其他錯誤。 – azurepancake

回答

2

如果將SDL_event對象的地址傳遞給SDL_PollEvent函數,SDL_PollEvent函數將從內部事件隊列中移除該事件。

printf調用,它也會在事件循環之前調用函數SDL_PollEvent,它將從隊列中刪除退出事件。這意味着事件循環將無法找到此事件:

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));