在 SDL 中退出事件循环

Exit event loop in SDL

我开始使用 C 语言进行 SDL 编程。这个简单的程序循环遍历彩虹色并用它们填充 window。 (如果有帮助,这是在带有 Gnome 的 Debian 上。)

出于某种原因,如果我单击关闭 window,程序永远不会注册退出信号。如何修复循环结构以便程序正常退出?

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

Window 关闭事件是 SDL_WINDOWEVENTwindow.event 设置为 SDL_WINDOWEVENT_CLOSE。您也只能从队列中获得一个事件,甚至不检查队列是否有事件。看看这个:

  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(或任何其他数字)通常是一个好习惯。