博客源码下载 : https://download.csdn.net/download/han1202012/89432451
SDL 事件处理代码执行效果如下 :
SDL , Simple DirectMedia Layer , 是 跨平台的多媒体开发库 , 用于开发 跨平台 的 多媒体应用程序 , 可开发 WIndows / Linux / MacOS 多媒体应用 , 编写一次代码 , 可以在多个平台运行 ;
使用 SDL 多媒体库开发的 应用 有如下功能 :
其中的 事件处理 , 就是处理 外设 ( 键盘 / 鼠标 ) 传入的事件 , 如 鼠标移动 , 鼠标点击 , 键盘按键 等事件 ;
SDL 事件处理步骤 :
代码示例 :
执行结果 : 运行程序后 , 弹出窗口 ,
此时开启循环 , 监听事件 , 每次循环时有事件发生 , 就会进入 if (event.type == SDL_QUIT)
分支语句 ,
点击窗口中右上角的 x 关闭按钮 , 会触发 SDL_QUIT
事件 , 此时退出事件循环 ,
继续执行代码就会关闭窗口 , 释放 SDL 资源 , 程序运行结束 ;
运行程序后弹出事件窗口 :
点击 窗口中的 关闭按钮 , 就会触发 SDL_QUIT 事件 ;
SDL_Event 用于存储各种事件 , 事件有如下类型 :
具体类型 , 在下面的 SDL_Event 联合体的代码注释中有详细说明 ;
SDL_Event 是一个联合体 定义在 SDL_event.h 头文件中 , 该 SDL_Event 联合体是一种特殊的数据结构 , 允许在相同的内存位置存储不同类型的数据 ;
完整的 SDL_Event 联合体 union 内容如下 :
代码位置 :
SDL_Event 联合体设计很巧妙 , 其第一个类型成员 Uint32 type
与 其它 25 个结构体类型成员 共同占用同一个内存空间 , 这 25 个结构体 的第一个参数也都是 Uint32 type
成员 ;
因此 , 不管是什么类型的 事件 , 都可以通过 获取 Uint32 type
成员 , 获得该成员的类型 , 然后根据该类型 , 就知道这是什么事件 , 直接调用该事件对应的结构体即可 ;
举例说明 : 获取的 SDL_Event
事件对象 的 Uint32 type
类型是键盘事件 SDL_KEYDOWN
, 那么就使用 SDL_KeyboardEvent
结构体的 数据格式 访问该 SDL_Event
事件 ;
SDL_KeyboardEvent 结构体内容如下 :
解析键盘事件的代码示例如下 : 调用 SDL_WaitEvent 函数 , 阻塞等待事件到来 , 事件到来后 ,
event.type
, 先看是哪种类型的事件 , 选择使用哪种结构体数据格式访问改事件数据 ;event.key.keysym.sym
成员 , 获取按下的是哪个按键 , 根据不同的按键 , 进行不同的操作 ;在上面的示例中 , 使用了 SDL_PollEvent 函数 , 检测是否有事件发生 ,
SDL_PollEvent 函数 是 非阻塞函数 , 如果没有事件发生 , 则立刻返回 , 不会阻塞程序执行 ; 与之相对的是 SDL_WaitEvent 函数 , 该函数会阻塞程序 , 等待事件发生 ;
SDL_PollEvent 函数原型如下 :
代码示例 : 使用 SDL_PollEvent 函数时 ,
SDL_WaitEvent 函数 的作用是 阻塞等待事件发生 , 如果没有事件发生 , 则程序会一直阻塞等待下去 , 当有事件发生时 , 再继续向下执行 ;
SDL_WaitEvent 函数原型如下 :
如果没有事件发生 , 则程序会一直阻塞下去 ;
代码示例 : 使用 SDL_WaitEvent 函数的流程如下 :
调用了 SDL_WaitEvent 函数后 , 会阻塞当前的程序 , 直到 事件发生 , 解除阻塞继续执行 ;
博客源码下载 : https://download.csdn.net/download/han1202012/89432451
代码示例 :
执行结果 :
鼠标移动 , 触发的事件 :
键盘按键 , 触发的事件 :
鼠标点击触发的事件 :