在 C 中使用 SDL2 发布关闭 window

Issue closing window with SDL2 in C

我有设置 window 以及关闭按钮功能的代码。

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

int initialize();
void handle_input();

typedef struct {
    SDL_Renderer *renderer;
    SDL_Window *window;
    bool running;
    int FPS;
    int width;
    int height;
    bool close_requested;
} Game;

Game game = {
  .running = true,
  .FPS = 60,
  .width = 600,
  .height = 600,
  .close_requested = false,
};

int main(int argc, char* argv[]) {

    initialize();
    handle_input();

    while(game.running) { //Game loop
        SDL_SetRenderDrawColor(game.renderer, 255, 0, 0, 255);
        SDL_RenderPresent(game.renderer);
        SDL_Delay(1000/game.FPS);
    } //End of game loop

    SDL_DestroyRenderer(game.renderer);
    SDL_DestroyWindow(game.window);
    SDL_Quit();

    return 0;
}

int initialize() {

    if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER) != 0) { //return 0 on success
        printf("error initializing SDL: %s\n", SDL_GetError());
        return 1;
    }

    SDL_Window* window = SDL_CreateWindow("Window", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, game.width, game.height, 0); //creates window
    if (!window) {
        printf("error creating window: %s\n", SDL_GetError());
        SDL_Quit();
        return 1;
    }

    Uint32 render_flags = SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC; //creates a renderer
    game.renderer = SDL_CreateRenderer(window, -1, render_flags);
    if (!game.renderer) {
        printf("error creating renderer: %s\n", SDL_GetError());
        SDL_DestroyWindow(window);
        SDL_Quit();
        return 1;
    }
}

void handle_input() {

    SDL_Event event;

    while (!game.close_requested) { //close button
        while (SDL_PollEvent(&event)) {
            if (event.type == SDL_QUIT) {
                game.close_requested = true;
                game.running = false;
            }
        }
    }
}

但是,每当我尝试 运行 这个程序时,window 甚至都不会打开,我在控制台中收到 0 个错误,除了一条警告 control may reach end of non-void functioninitialize() 函数中。那个警告是什么意思?我的代码怎么了?我做错了什么?

我在这里看到 2 个问题:

  1. 您在进入主循环之前在主程序中调用了 handle_input() 并且它一直卡在那里直到您退出,因此永远不会调用 SDL_RenderPresent()。
  2. 初始化函数在成功的情况下不会return任何东西,这就是您看到警告的原因。

尝试进行以下更改,在 main() 中将输入处理移到循环内:

int main(int argc, char* argv[]) {

    initialize();

    while(game.running && !game.close_requested) {
        handle_input(); // <-- move here
        SDL_SetRenderDrawColor(game.renderer, 255, 0, 0, 255);
        SDL_RenderPresent(game.renderer);
        SDL_Delay(1000/game.FPS);
    }
    // the rest...
}

在initialize()的末尾添加一个return 0;

在handle_input()中去掉外层循环:

void handle_input() {
    SDL_Event event;

    while (SDL_PollEvent(&event)) {
        if (event.type == SDL_QUIT) {
            game.close_requested = true;
            game.running = false;
        }
    }
}