2016-09-18 14 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

:あなたが唯一のキューに保留中のイベントがあるかどうかを確認したい場合は

printf("%d", SDL_PollEvent(&e)); while(SDL_PollEvent(&e) != 0) { if(e.type == SDL_QUIT) { quit = true; } } 

が、その後、NULL引数で関数SDL_PollEventを使用します。これは、イベントループは、このイベントを見つけないことを意味します'close()'コールのスコープに問題がありますか? '-w'で無視するのではなく)警告を確認できますか?私は彼らがCコマンドラインで 'close'を言い張っていると思う。 –

+1

'私は、物が壊れているかどうか教えてくれません(-w)。なぜ誰かが物が壊れているのか教えてもらえますか? ' – kfsone

+0

申し訳ありませんが、これはチュートリアルで使用するように指示されたコマンドでした。 "-w"を削除しても、エラーは発生しません。 – azurepancake

答えて

2

機能SDL_PollEventは、SDL_eventオブジェクトのアドレスが渡された場合、そのイベントを内部イベントキューから削除します。

キューから終了イベントを削除するイベントループの前に、関数SDL_PollEventも呼び出すprintf呼び出し。

printf("%d", SDL_PollEvent(NULL)); 
関連する問題