SDL事件之简单退出事件SDL_QUIT

发布时间 2023-11-14 14:55:14作者: 飘杨......

一、概述

  上一篇使用SDL加载了一张图片,图片展示后3秒窗口会自动关闭,如果不想让窗口自动关闭,而是用户自己指定啥时候关闭就啥时候关闭,该怎么弄?

  那就有必要加上SDL的事件了。

  加入一个简单的SDL事件非常简单。以点击X号关闭窗口为例:

  1.初始化SDL事件

    //初始化SDL事件
    SDL_Event event;
    bool quit = false;//窗口结束条件

  2.创建一个死循环,使用SDL_WaitEvent来接收触发的事件,如果有事件到来,则event中就会接收到传递过来的事件

    while (!quit) {
        //主消息循环,如果有事件过来就拿到这个事件对象
        SDL_WaitEvent(&event);
        switch (event.type) {
        case SDL_QUIT://输入事件冲菜单退出(其实就是点击右上角的叉号的时候会执行这个)
            cout << "关闭了窗口" << endl;
            quit = true;
            break;
        }
    }

 

二、代码示例(完整示例代码)

  加上了SDL的事件后,SDL显示的窗口就不会很僵硬的等待3秒关闭了。而是用户随时都可以关闭。

//初始化SDL事件
SDL_Event event;
bool quit = false;//窗口结束条件

//初始化SDL
SDL_Init(SDL_INIT_EVERYTHING);
//创建一个Surface
SDL_Surface* surface = IMG_Load("E:/tony/demo/visualstudio_workspace/SDLDemo/SDLDemo/images/cat2.jpg");
//创建SDL窗口,这里window的宽高直接指定为surface的宽高即可
SDL_Window* window = SDL_CreateWindow("window name", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, surface->w,surface->h,0);
//初始化SDL_IMAGE(这个主要是为了方便加载图片)
IMG_Init(IMG_INIT_PNG|IMG_INIT_JPG);
//创建渲染器
SDL_Renderer* renderer = SDL_CreateRenderer(window,-1,0);

//创建纹理
SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer,surface);

while (!quit) {
    //主消息循环,如果有事件过来就拿到这个事件对象
    SDL_WaitEvent(&event);
    switch (event.type) {
    case SDL_QUIT://输入事件冲菜单退出(其实就是点击右上角的叉号的时候会执行这个)
        cout << "关闭了窗口" << endl;
        quit = true;
        break;
    }
    //如果有事件过来就更新一次UI
        //把纹理渲染到渲染器上
    SDL_RenderCopy(renderer, texture, NULL, NULL);
    //把渲染器中的数据渲染到屏幕上
    SDL_RenderPresent(renderer);
}

//执行销毁动作
//销毁纹理
SDL_DestroyTexture(texture);
//释放surface
SDL_FreeSurface(surface);
//销毁渲染器
SDL_DestroyRenderer(renderer);
//销毁window
SDL_DestroyWindow(window);

//退出SDL_Image库
IMG_Quit();
//退出SDL
SDL_Quit();