当前位置: 首页 > 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。

作品:

安卓手机多线程投屏系统

相关文章:

  • 如何选择服务器机房托管服务?
  • OpenCV入门
  • Seata分布式事物案例及详解
  • 如何配置jmeter做分布式压测
  • Spring Boot + MyBatis-Plus实现操作日志记录
  • oracle数据库生成awr报告,排查数据库服务器CPU100%,系统卡顿,慢sql,根据sqlid查询关键信息,如会话SID,客户端机器名
  • MySQL 8.0 OCP 1Z0-908 题目解析(11)
  • MySQL 8.0 OCP 1Z0-908 题目解析(13)
  • 游戏引擎学习第307天:排序组可视化
  • 计算机网络学习(三)——HTTP
  • C++——STL——封装红黑树实现mymap与myset
  • LinkedList 与 ArrayList 的区别及使用场景
  • I-CON: A UNIFYING FRAMEWORK FOR REPRESENTATION LEARNING
  • Android 网络全栈攻略(四)—— 从 OkHttp 拦截器来看 HTTP 协议一
  • 光子计算落地里程碑:实验级OSS芯片实现MNIST高效分类,登顶《Nature》子刊
  • 精益数据分析(81/126):从Timehop案例看病毒性增长的黑客式策略
  • 原创|查询大数据级数据表的AI实现思路(Excel2SQL,Text2SQL)
  • NFS服务小实验
  • 电子电气架构 --- 下一代汽车电子电气架构中的连接性
  • Llamaindex Rag 报错
  • wordpress语言包编辑/知乎关键词排名优化工具
  • 沈阳网站开发简维/黑龙江头条今日新闻
  • 郑州网站建设国奥大厦/网络营销模式案例
  • 做网站推广 需要ftp/互联网销售平台
  • 广东省建设工程安监局网站/站长工具seo排名
  • 深圳建站公司优化/软文营销的特点