我目前正在通过阅读Lazy foo教程来学习SDL。我在Linux上使用代码块13.12。我无法使事件处理正常工作。

我基本上是在尝试显示图像(效果很好),但是无论我单击关闭按钮多少次,它都不会关闭

码:

#include <SDL2/SDL.h>
#include <stdio.h>
//Declaring the main window, the main surface and the image surface
SDL_Window *window = NULL;
SDL_Surface *scrsurface = NULL;
SDL_Surface *imgSurface = NULL;
SDL_Event event;
int run = 1;

//The function where SDL will be initialized
int init();
//The function where the image will be loaded into memory
int loadImage();
//The function that will properly clean up and close SDL and the variables
int close();

//The main function
int main(void){
    if(init() == -1)
        printf("Init failed!!!");
    else{
        if(loadImage() == -1)
            printf("loadImage failed!!!");
        else{

            //Displaying the image

            while(run){
                //Event handling
               while(SDL_PollEvent(&event)){
                    switch(event.type){
                        case SDL_QUIT:
                            run = 0;
                            fprintf(stderr, "Run set to 0");
                            break;
                        default:
                            fprintf(stderr, "Unhandled event");
                         break;
                    }
                }
                //Blitting nad updating
                SDL_BlitSurface(imgSurface, NULL, scrsurface, NULL);
                SDL_UpdateWindowSurface(window);
            }
        close();

        }
    }
    return 0;

}

int init(){
 if(SDL_Init(SDL_INIT_VIDEO) < 0)
    return -1;
 else{
    window = SDL_CreateWindow("SDL_WINDOW", SDL_WINDOWPOS_UNDEFINED,  SDL_WINDOWPOS_UNDEFINED, 900, 900, SDL_WINDOW_SHOWN);
    if(window == NULL)
        return -1;
    scrsurface = SDL_GetWindowSurface(window);

}
return 0;
}


int loadImage(){
    imgSurface = SDL_LoadBMP("Test.bmp");
    if(imgSurface == NULL)
        return -1;
    else{

    }
    return 0;
}

int close(){
    SDL_FreeSurface(imgSurface);
    SDL_DestroyWindow(window);
    window = NULL;
    SDL_Quit();
    return 0;

}


`

最佳答案

尽管需要进行彻底的调试以确定确切的结果,但是您的问题很可能是由于libc的close函数和您的函数的别名引起的。 close是许多库使用的非常重要的调用,包括Xlib(由SDL调用)。例如。 SDL_CreateWindow调用XOpenDisplay / XCloseDisplay以测试显示功能,但是XCloseDisplay在其连接套接字上调用close,它将改为调用您的函数。很难说那之后会发生什么,但是肯定不是预期的。

解决方法是将功能重命名为其他名称(例如,给它加上前缀)或声明为static,这样就不会导出其名称。请注意,静态函数只能在单个转换单元内使用(即,如果您的.c文件包含静态函数,则无法轻松地从另一个.c文件使用它)。

链接器此处未报告多个定义,因为libc的关闭是一个弱符号(nm -D /lib/libc.so.6 | egrep ' close$'报告W)。

关于c - SDL事件处理不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31482117/

10-13 07:10