SDL 事件处理

本文介绍了如何使用SDL_Init方法初始化SDL并设置所需的子系统标志。详细解释了如何利用SDL_PushEvent、SDL_PumpEvents、SDL_WaitEvent、SDL_PollEvent和SDL_PeepEvents等函数来处理事件队列中的事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概论

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个事件返回,并把它们从队列中删除。

转载于:https://my.oschina.net/u/735973/blog/832117

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值