当前位置: 首页 > news >正文

SDL2 消息循环和事件响应

1.简介

SDL事件可以是用户输入、系统通知或窗口管理事件等。SDL事件可以通过SDL_PollEvent和SDL_WaitEvent函数来获取。在SDL中,事件是通过SDL_Event结构体表示的,其中包含事件类型以及与该类型相关的具体数据。 下面是一些常见的SDL事件类型和相关的事件数据:

  • SDL_QUIT:应用程序退出事件。
  • SDL_KEYDOWN/SDL_KEYUP:键盘按键按下/松开事件。
  • SDL_MOUSEMOTION:鼠标移动事件。
  • SDL_MOUSEBUTTONDOWN/SDL_MOUSEBUTTONUP:鼠标按键按下/松开事件。
  • SDL_WINDOWEVENT:窗口事件(如窗口大小改变、窗口最小化、窗口最大化等)。
  • SDL_USEREVENT:用户自定义事件。

2.简单示例

一下这几行代码就是 SDL 消息循环和事件响应的核心了,写一个死循环,然后通过SDL_PollEvent不断的从事件队列中取事件,如果有则返回 1,没有则返回 0。

当用户点击了窗口关闭的时候,对应 SDL_Event 的 type 就是SDL_QUIT,这个 type 是一定要添加处理的,不然点叉就关闭不了窗口了。

 SDL_Event windowEvent;while (true){if (SDL_PollEvent(&windowEvent)){if (SDL_QUIT == windowEvent.type){break;}}}

3.SDL_PollEvent和SDL_WaitEvent区别 

除了SDL_PollEvent方法去取消息外,还有SDL_WaitEvent方法。顾名思义,该方法会阻塞当前调用的线程,直到取出一个消息为止。

SDL_PollEvent:
SDL_PollEvent函数是一个非阻塞函数,它会不断地检查 SDL 事件队列,直到有事件产生。如果有事件到达,它将将其从队列中取出并返回。如果没有事件,SDL_PollEvent会返回0。这种方式可以在事件到达时立即处理,而不需要等待。但是,如果程序需要等待某个特定事件,这种方法可能不够灵活。


SDL_WaitEvent:
SDL_WaitEvent函数是一个阻塞函数,它会等待 SDL 事件队列中的事件。直到有事件到达时,它才会返回。与SDL_PollEvent不同,SDL_WaitEvent会在没有事件时阻塞等待,直到事件到达或超时。这种方式在需要等待特定事件(例如用户输入)时非常有用。但是,如果事件处理程序在等待事件时需要执行其他任务,程序可能会变得不够高效。

4.自定义事件响应

除了系统事件,还可以自定义事件。

首先定义一个事件类型的宏:REFRESH_EVENT (一个刷新事件的宏)。

//Refresh Event
#define REFRESH_EVENT  (SDL_USEREVENT + 1)

其次,要创建一个线程,让它延时40毫秒后,发送自定义事件,在主线程中去接收到这个事件。

定义一个 SDL_Event数据结构,把它的 type 赋值为自定义的类型,然后通过方法SDL_PushEvent把该消息事件放到消息队列中去。

int thread_exit=0;int refresh_video(void *opaque){while (thread_exit==0) {SDL_Event event;event.type = REFRESH_EVENT;SDL_PushEvent(&event);SDL_Delay(40);}return 0;
}//创建线程
SDL_Thread *refresh_thread = SDL_CreateThread(refresh_video,NULL,NULL);

事件处理主线程:

SDL_Event event;
while(1)
{//WaitSDL_PollEvent(&event);if(event.type==REFRESH_EVENT){//deal		}else if(event.type==SDL_QUIT){break;}
}

相关文章:

  • RESTful(Representational State Transfer)
  • 第五章 将对象映射到 XML - 指定映射 XML 文档的格式选项
  • 5、鸿蒙项目远程调试
  • 目标检测—YOLO系列(二 ) 全面解读论文与复现代码YOLOv1 PyTorch
  • 【数据结构】栈与队列的实现
  • Elasticsearch 索引库操作与 Rest API 使用详解
  • Cloud
  • 【解决】使用Element-Plus icon图标不显示
  • 云ES高级监控告警
  • 【机器学习】朴素贝叶斯算法:多项式、高斯、伯努利,实例应用(心脏病预测)
  • 跨境电商测评新方案,安全可靠,高成功率
  • Python开源项目GPEN——人脸重建(Face Restoration),模糊清晰、划痕修复及黑白上色的实践
  • 基于蝠鲼觅食算法优化概率神经网络PNN的分类预测 - 附代码
  • 简单的 UDP 网络程序
  • Flink CDC
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • C++入门教程(10):for 语句
  • CSS3 变换
  •  D - 粉碎叛乱F - 其他起义
  • Druid 在有赞的实践
  • java8-模拟hadoop
  • k8s 面向应用开发者的基础命令
  • leetcode388. Longest Absolute File Path
  • LintCode 31. partitionArray 数组划分
  • linux安装openssl、swoole等扩展的具体步骤
  • Objective-C 中关联引用的概念
  • Python - 闭包Closure
  • React 快速上手 - 07 前端路由 react-router
  • Redis的resp协议
  • Service Worker
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 规范化安全开发 KOA 手脚架
  • 前端面试题总结
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 微服务核心架构梳理
  • 项目实战-Api的解决方案
  • 赢得Docker挑战最佳实践
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​2020 年大前端技术趋势解读
  • #etcd#安装时出错
  • %@ page import=%的用法
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • .form文件_SSM框架文件上传篇
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .NET/C# 使窗口永不获得焦点
  • .NET企业级应用架构设计系列之开场白
  • @Autowired注解的实现原理
  • [ Linux 长征路第二篇] 基本指令head,tail,date,cal,find,grep,zip,tar,bc,unname
  • [1]-基于图搜索的路径规划基础
  • [20171101]rman to destination.txt