无法关闭窗口

时间:2016-09-18 21:08:53

标签: c++ c sdl

我正在关注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?

1 个答案:

答案 0 :(得分:3)

如果SDL_event对象的地址被传递给它,函数SDL_PollEvent将从内部事件队列中删除该事件。

在事件循环之前调用函数SDL_PollEvent的printf调用将从队列中删除退出事件。这意味着事件循环将找不到此事件:

damage

如果您只想检查队列中是否有待处理的事件,请使用带有NULL参数的函数SDL_PollEvent:

printf("%d", SDL_PollEvent(&e));

while(SDL_PollEvent(&e) != 0) {
    if(e.type == SDL_QUIT) {
        quit = true;
    }
}