随笔 - 632  文章 - 17  评论 - 54  阅读 - 93万

SDL事件之简单退出事件SDL_QUIT

一、概述

  上一篇使用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();
复制代码

 

posted on   飘杨......  阅读(396)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
历史上的今天:
2014-11-14 Unable to execute dex: Multiple dex files defineLcom/google/gson/JsonDeserializer;
2014-11-14 Android 工程引入自定义Library后,工程无法识别Library中的类
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示