2016-10-07 19 views
1

私はCでSDLプログラミングを開始しています。この単純なプログラムは、虹色でループし、ウィンドウをウィンドウで満たします。 (これはGnomeのDebianで役に立ちます。)SDLでイベントループを終了

何らかの理由で、ウィンドウを閉じるために何かの理由でプログラムが終了信号を登録しない場合があります。プログラムが正しく終了するようにループ構造を修正するにはどうすればよいですか?

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

int main(void) 
{ 
    SDL_Window *window; 
    SDL_Renderer *renderer; 
    SDL_Event event; 
    bool quit = false; 
    int i; 
    int rgb_rainbow[6][3] = { {255, 0, 0}, 
          {255, 127, 0}, 
          {255, 255, 0}, 
          {0, 255, 0}, 
          {0, 0, 255}, 
          {75, 0, 130} }; 

    if (SDL_Init(SDL_INIT_VIDEO) < 0) { 
    SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, 
       "Couldn't initialize SDL: %s", SDL_GetError()); 
    return(3); 
    } 
    if (SDL_CreateWindowAndRenderer(640,640, 
            SDL_WINDOW_RESIZABLE, &window, &renderer)) { 
    SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, 
       "Couldn't create window and renderer: %s", SDL_GetError()); 
    return(3); 
    } 

    while (quit == false) { 
    for (i = 0; i < 6; ++i) { 
     SDL_PollEvent(&event); 
     if (event.type == SDL_QUIT) { 
     quit = true; 
     break; 
     } 
     SDL_SetRenderDrawColor(renderer, 
          rgb_rainbow[i][0], 
          rgb_rainbow[i][1], 
          rgb_rainbow[i][2], 255); 
     SDL_RenderClear(renderer); 
     SDL_RenderPresent(renderer); 
     SDL_Delay(500); 
    } 
    } 

    SDL_DestroyRenderer(renderer); 
    SDL_DestroyWindow(window); 

    SDL_Quit(); 

    return(0); 
} 

答えて

1

ウィンドウ閉鎖イベントはSDL_WINDOWEVENT_CLOSEからwindow.eventセットとSDL_WINDOWEVENTです。あなたはまた、イベントfronキューを1つだけ取得し、キューがあるかどうかをチェックしません。これをチェックアウト:

while (quit == false) { 
    for (i = 0; i < 6; ++i) { 
     while(SDL_PollEvent(&event)) { 
      if (event.type == SDL_QUIT || 
        (event.type == SDL_WINDOWEVENT && 
        event.window.event == SDL_WINDOWEVENT_CLOSE)) { 
      quit = true; 
      } 
     } 
     if(quit) { break; } 

     SDL_SetRenderDrawColor(renderer, 
          rgb_rainbow[i][0], 
          rgb_rainbow[i][1], 
          rgb_rainbow[i][2], 255); 
     SDL_RenderClear(renderer); 
     SDL_RenderPresent(renderer); 
     SDL_Delay(500); 
    } 
    } 

一般的にあなたのメインループが1フレームだけではなく、6(または任意の他の数)をレンダリング持つことをお勧めします。

関連する問題