2016-10-07 3 views
1

나는 C로 SDL 프로그래밍을 시작했습니다.이 간단한 프로그램은 무지개 색상을 반복하고 창을 채 웁니다. (이것이 도움이된다면 데비안의 Gnome에 있습니다.)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 큐를 가져오고 큐에 큐가 있는지 확인하지 않습니다. 이 체크 아웃 :

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

을 일반적으로 메인 루프가 하나의 프레임이 아니라 6 (또는 다른 번호)를 렌더링해야하는 것이 좋습니다.