文档章节

SDL 事件处理

曾经花田错
 曾经花田错
发布于 2017/02/06 01:16
字数 537
阅读 116
收藏 0

概论

SDL 的事件处理用 SDL_Init 方法来初始化;参数为int类型的flag,flag可以设置多个:

/** @name SDL_INIT Flags
 *  These are the flags which may be passed to SDL_Init() -- you should
 *  specify the subsystems which you will be using in your application.
 */
/*@{*/
#define	SDL_INIT_TIMER		0x00000001
#define SDL_INIT_AUDIO		0x00000010
#define SDL_INIT_VIDEO		0x00000020
#define SDL_INIT_CDROM		0x00000100
#define SDL_INIT_JOYSTICK	0x00000200
#define SDL_INIT_NOPARACHUTE	0x00100000	/**< Don't catch fatal signals */
#define SDL_INIT_EVENTTHREAD	0x01000000	/**< Not supported on all OS's */
#define SDL_INIT_EVERYTHING	0x0000FFFF
flags = SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER;

if (SDL_Init (flags)) {
        av_log(NULL, AV_LOG_FATAL, "Could not initialize SDL - %s\n", SDL_GetError());
        av_log(NULL, AV_LOG_FATAL, "(Did you set the DISPLAY variable?)\n");
        exit(1);
    }

SDL对事件的内部实现是,将待操作的事件都放在队列里,使用函数 SDL_PollEvent(), SDL_PeepEvents() 和 SDL_WaitEvent() 你可以观察和处理这些事件。

相关函数

1. int SDL_PushEvent(SDL_Event* event)

将一个事件放入队列。成功返回1,发生错误返回0。

2. void SDL_PumpEvents(void)

 此函数收集来自输入设备的事件,填入事件循环中,从而更新事件队列。除了调用此方法,不然输入事件没法被填入到队列中。在函数 SDL_PollEvent 和SDL_WaitEvent 中,都调用了该方法。总之,如果你不是“轮询”或者 “等待” 事件(polling or waiting for events),那你一定要调用此函数强制刷新事件队列。

3. int SDL_WaitEvent(SDL_Event* event)

此函数会一直等下去知道获得一个可用的事件。

4. int SDL_PollEvent(SDL_Event* event)

此函数轮询当前的挂起事件,有没有事件都会返回。这是一种比较好的获取系统事件的方式,因为它由主线程调用并返回,而不会因为等待一个事件而阻塞主线程。

5.int SDL_PeepEvents(SDL_Event *events, int numevents,
                SDL_eventaction action, Uint32 mask);

此函数检查事件队列,并根据action不同进行不同的操作。

typedef enum {
	SDL_ADDEVENT,
	SDL_PEEKEVENT,
	SDL_GETEVENT
} SDL_eventaction;

当 action 为 SDL_ADDEVENT ,函数将会把数量为numevents的事件添加到事件队列的末尾;

当 action 为 SDL_PEEKEVENT,函数将会把事件队列前部、匹配 'mask' 的numevents个事件返回,但不把它们从队列中删除;

当 action 为 SDL_GETEVENT,函数将会把事件队列前部、匹配 'mask' 的numevents个事件返回,并把它们从队列中删除。

© 著作权归作者所有

共有 人打赏支持
曾经花田错
粉丝 5
博文 42
码字总数 39130
作品 0
海淀
程序员
SDL_Engine游戏引擎制作 3-Window 游戏窗口

SDL编写程序的第一步先是初始化SDL,然后就是创建窗口。然后就是创建基于本窗口的渲染器(Renderer 姑且称为渲染器吧)。SDL中的窗口为SDL_Window,是一个结构体,与之对应的有各种与窗口处理相...

bull521
03/27
0
0
SDL系列讲解(十一) SDL_QUIT流程

明天会将自己的很早的一部小说发出,一次发出写的所有的六章,如果时间,或者某天突然觉得可以续写了,那么就是它又一次起航了。 工作期间,码了一个记录工作的小说,有兴趣的可以阅读。当然...

代码GG陆晓明
2017/10/28
0
0
关于sdl在ios中输入拼音的问题

做的是ios app,我们现在项目里面用的sdl跨平台,平常开发在windows下,在处理文本输入的时候,英文输入的情况在windows和ios下都没有任何问题,问题出在中文输入上。 在windows下,用拼音输...

hellodudu86
2014/06/28
242
0
SDL系列讲解(十) 按键处理流程

SDL系列讲解(一) 简介 SDL系列讲解(二) 环境搭建 SDL系列讲解(三) 工具安装 SDL是什么,能干什么,为什么我们要学习它? SDL系列讲解(四) demo讲解 SDL系列讲解(五) 调试c代码 SD...

代码GG陆晓明
2017/10/28
0
0
「SDL第八篇」支持倍速与慢放的YUV视频播放器

前言 今天向大家介绍一下如何通过 SDL 实现一个YUV视频播放器。它与上次介绍的音频播放器一样,也是一个简单的不能再简单的播放器了。只不过一个是播放的音频PCM数据,另一个播放的时视频YUV...

音视频直播技术专家
04/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Bash重定向详解

Bash重定向详解 Bash的重定向指的是将命令的输入和输出导向不同地方,而不是默认的标准输入、标准输出和标准错误。Bash的重定向实际上是对标准输入、标准输出和标准错误的重置,进而将所需输...

小陶小陶
今天
3
0
EventBus原理深度解析

一、问题描述 在工作中,经常会遇见使用异步的方式来发送事件,或者触发另外一个动作:经常用到的框架是MQ(分布式方式通知)。如果是同一个jvm里面通知的话,就可以使用EventBus。由于Event...

yangjianzhou
今天
6
0
OpenCV图像处理实例:libuv+cvui显示摄像头视频

#include <iostream>#include <opencv2/opencv.hpp>#define CVUI_IMPLEMENTATION#include <cvui.h>extern "C"{#include <uv.h>}using namespace std;#define WINDOW_NAM......

IOTService
今天
3
0
openJDK之JDK9的String

1.openJDK8的String 先来看下openJDK8的String的底层,如下图1.1所示: 图1.1 底层上使用的是char[],即char数组 每个char占16个bit,Character.SIZE的值是16。 2.openJDK9中的String 图2.1...

克虏伯
今天
4
0
UEFI 模式下如何安装 Ubuntu 16.04

作者:知乎用户 链接:https://www.zhihu.com/question/52092661/answer/259583475 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 针对UEFI模式下安装U...

寻知者
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部