SDL 事件處理

概論

SDL 的事件處理用 SDL_Init 方法來初始化;參數爲int類型的flag,flag能夠設置多個:app

/** @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)spa

將一個事件放入隊列。成功返回1,發生錯誤返回0。線程

2. void SDL_PumpEvents(void)code

 此函數收集來自輸入設備的事件,填入事件循環中,從而更新事件隊列。除了調用此方法,否則輸入事件無法被填入到隊列中。在函數 SDL_PollEvent 和SDL_WaitEvent 中,都調用了該方法。總之,若是你不是「輪詢」或者 「等待」 事件(polling or waiting for events),那你必定要調用此函數強制刷新事件隊列。隊列

3. int SDL_WaitEvent(SDL_Event* event)事件

此函數會一直等下去知道得到一個可用的事件。ci

4. int SDL_PollEvent(SDL_Event* event)get

此函數輪詢當前的掛起事件,有沒有事件都會返回。這是一種比較好的獲取系統事件的方式,由於它由主線程調用並返回,而不會由於等待一個事件而阻塞主線程。it

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個事件返回,並把它們從隊列中刪除。

相關文章
相關標籤/搜索