一、概述
上一篇使用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();
标签:QUIT,surface,window,事件,SDL,event,renderer From: https://www.cnblogs.com/tony-yang-flutter/p/17831582.html