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

SDL2常用函数SDL事件处理:SDL_Event|SDL_PollEvent

SDL_Event

SDL_Event是个联合体,是SDL中所有事件处理的核心。 SDL_Event是SDL中使用的所有事件结构的并集。 只要知道了那个事件类型对应SDL_Event结构的那个成员,使用它是一个简单的事情。

下表罗列了所有SDL_Event的所有成员和对应类型。

Uint32typeevent type, shared with all events
SDL_CommonEventcommon常见事件数据
SDL_WindowEventwindow
SDL_KeyboardEventkey键盘事件数据
SDL_TextEditingEventedit文本编辑事件数据
SDL_TextInputEventtext文本输入事件数据
SDL_MouseMotionEventmotion鼠标运动事件数据
SDL_MouseButtonEventbutton鼠标按钮事件数据
SDL_MouseWheelEventwheel鼠标滚轮事件数据
SDL_JoyAxisEventjaxis操纵杆轴事件数据
SDL_JoyBallEventjball操纵杆球事件数据
SDL_JoyHatEventjhat操纵杆帽子事件数据
SDL_JoyButtonEventjbutton操纵杆按钮事件数据
SDL_JoyDeviceEventjdevice操纵杆设备事件数据
SDL_ControllerAxisEventcaxis游戏控制器轴事件数据
SDL_ControllerButtonEventcbutton游戏控制器按钮事件数据
SDL_ControllerDeviceEventcdevice游戏控制器设备事件数据
SDL_AudioDeviceEventadevice音频设备事件数据(> = SDL 2.0.4)
SDL_QuitEventquit退出请求事件数据
SDL_UserEventuser自定义事件数据
SDL_SysWMEventsyswm系统相关的窗口事件数据
SDL_TouchFingerEventtfinger触摸手指事件数据
SDL_MultiGestureEventmgesture多指手势数据
SDL_DollarGestureEventdgesture多指手势数据
SDL_DropEventdrop拖拽事件数据

SDL_Event联合体包含了外界操作SDL的几乎所有操作事件,所以成员稍微有点多。选了几个简单的联合体成员分析一下:

/***  \brief Fields shared by every event*/
typedef struct SDL_CommonEvent
{Uint32 type;        // 事件类型Uint32 timestamp;   // 以毫秒为单位,使用SDL_GetTicks()填充
} SDL_CommonEvent;
/***  键盘按钮事件结构(event.key)*/
typedef struct SDL_KeyboardEvent
{Uint32 type;        // 事件类型:按下按键,按键弹起(SDL_KEYDOWN or SDL_KEYUP)Uint32 timestamp;   // 以毫秒为单位,使用SDL_GetTicks()填充Uint32 windowID;    // 具有键盘焦点的窗口idUint8 state;        // SDL_PRESSED or SDL_RELEASEDUint8 repeat;       // 如果这是重复键,则非零Uint8 padding2;Uint8 padding3;SDL_Keysym keysym;  // 按下或释放的键
} SDL_KeyboardEvent;

SDL的所有事件都是存储在一个队列中,而SDL_Event的常规操作,就是从这个队列中读取事件或者写入事件。

SDL_PollEvent

SDL_PollEvent函数便是从事件队列中,读取事件的常用函数。

函数原型为:

int SDL_PollEvent(SDL_Event * event);

函数的作用是,对当前待处理事件进行轮询。

返回值:如果时间队列中有待处理事件,返回1;如果没有可处理事件,则返回0。

参数event:如果不为NULL,则从队列中删除下一个事件并将其存储在该区域中。

示例代码
鼠标移动时间的简单处理代码:

SDL_Event test_event;
while (SDL_PollEvent(&test_event)) {switch (test_event.type) {case SDL_MOUSEMOTION:printf("We got a motion event.\n");printf("Current mouse position is: (%d, %d)\n", test_event.motion.x, test_event.motion.y);break;default:printf("Unhandled Event!\n");break;}
}
printf("Event queue empty.\n");
  1. 首先需要申明一个SDL_Event变量,方便轮巡事件队列时使用。
  2. 通过SDL_PollEvent()函数获取指向要填充事件信息的SDL_Event结构的指针。
    我们知道,如果SDL_PollEvent()从队列中删除了一个事件,那么事件信息将放在我们的test_event结构中。
  3. 为了单独处理每个事件类型,我们使用switch语句。
  4. 我们通常需要知道正在寻找什么样的事件以及这些事件的类型。 例如,在示例代码中,我们想要检测用户在我们的应用程序中移动鼠标指针的位置。
    我们会查看我们的事件类型,并注意到SDL_MOUSEMOTION很可能是我们正在寻找的事件。
    查看下表,知道SDL_MOUSEMOTION事件是在SDL_MouseMotionEvent结构中处理的,然后我们就可以通过SDL_MouseMotionEvent的结构,获得我们想要的数据,例如鼠标移动的位置x
    and y。

作品:

安卓手机多线程投屏系统

http://www.xdnf.cn/news/606043.html

相关文章:

  • Vue+css实现扫描动画效果(使用@keyframes scan)
  • RequestBody注解中Map
  • 为什么信号经过线束会有衰减?
  • AG32VH 系列应用指南
  • 嵌入式鸿蒙openharmony应用开发环境搭建与工程创建实现
  • Postgresql 数据库实例管理命令
  • Spring IoC容器初始化过程
  • 设计模式-结构型模式(详解)
  • el-dialog 组件 多层嵌套 被遮罩问题
  • Redis 缓存使用的BigKey问题
  • SAP在金属行业的数字化转型:无锡哲讯科技的智能解决方案
  • A10服务器使用vllm推理框架成功运行Qwen3大模型
  • 机器学习第二十四讲:scikit-learn → 机器学习界的瑞士军刀
  • Rancher 部署与使用指南
  • 使用Rancher在CentOS 环境上部署和管理多Kubernetes集群
  • 如何把一台电脑作为另外一台电脑的显示器
  • 地理特征类可视化图像
  • Java 依赖管理工具:使用 Sonatype Nexus 管理项目依赖
  • Ubantu安装 Jenkins LTS
  • AI大模型和SpringAI简介
  • 2025年最新基于Vue基础项目Todolist任务编辑器【适合新手入手】【有这一片足够了】【附源码】
  • php本地 curl 请求证书问题解决
  • Map的遍历与判断键是否存在-《Go语言实战指南》
  • ArcGIS Pro 3.4 二次开发 - 编辑
  • 基于RT-Thread的STM32F4开发第七讲——RTC(硬件、软件)
  • ATGM332D-F8N22单北斗多频定位导航模块
  • SQLMesh Typed Macros:让SQL宏更强大、更安全、更易维护
  • 【闲聊篇】java好丰富!
  • RabbitMQ配置环境变量
  • onnx模型转入rknn3399平台上工作记录