typedef union{ Uint8 type; SDL_ActiveEvent active; SDL_KeyboardEvent key; SDL_MouseMotionEvent motion; SDL_MouseButtonEvent button; SDL_JoyAxisEvent jaxis; SDL_JoyBallEvent jball; SDL_JoyHatEvent jhat; SDL_JoyButtonEvent jbutton; SDL_ResizeEvent resize; SDL_ExposeEvent expose; SDL_QuitEvent quit; SDL_UserEvent user; SDL_SysWMEvent syswm; } SDL_Event;
SDL_Event聯合是SDL中事件處理的核心,它可能是除SDL_Surface之外最重要的結構。SDL_Event是SDL中所有事件結構的聯合。通過它,可以輕易知道聯合成員與事件類型的對應關系。
SDL_Event structure有兩種用法
可以通過SDL_PollEvent或SDL_PeepEvents從事件隊列中讀取事件。我們將用SDL_PollEvent來逐步探討一個例子。
首先,創建一個空的SDL_Event結構。
SDL_Event test_event;
SDL_PollEvent從事件隊列中刪除下一事件。若事件隊列中沒有事件,則返回0;否則,返回1。我們使用一個while循環來依次處理每一事件。
while(SDL_PollEvent(&test_event)) {
SDL_PollEvent函數接受一個指向用于填充事件信息的SDL_Event結構的指針。若SDL_PollEvent從隊列中刪除一個事件,則該事件的信息將被填充到test_event結構。同時,事件的類型也會被填寫到test_event的type成員中。因此,我們使用switch語句來分別處理每個事件的類型。
switch(test_event.type) {
我們需要知道所期望的是哪種事件以及這些事件的事件類型值。假設我們想檢查用戶將鼠標指針移動到應用程序之內的什麼地方。認真看看事件類型可以發現SDL_MOUSEMOTION更像是我們所期望的事件。稍為深入探究就會發現,SDL_MOUSEMOTION事件是通過SDL_Event的成員motion所對應的SDL_MouseMotionEvent結構來處理的。我們可以在switch語句內像下邊這樣檢查SDL_MOUSEMOTION事件的類型:
case SDL_MOUSEMOTION:
我們現在要做的是讀出test_event的成員motion的信息。
printf("獲取一個移動事件。"); printf("當前鼠標位置是:(%d, %d)", test_event.motion.x, test_event.motion.y); break; default: printf("未處理事件!"); break; } } printf("事件隊列已空。");
也可以將事件壓入事件隊列。因此,可將它用作雙向通信方式。SDL_PushEvent和SDL_PeepEvents都可以將事件壓入事件隊列。這通常用于將SDL_USEREVENT壓入事件隊列。然而,如果你想的話,你可以用它來傳遞偽輸入事件。很容易創建你自己的事件,只要選擇好你期望的事件類型、設置type成員,並將信息填寫到適當的結構類型的成員。
SDL_Event user_event; user_event.type=SDL_USEREVENT; user_event.user.code=2; user_event.user.data1=NULL; user_event.user.data2=NULL; SDL_PushEvent(&user_event);
SDL_PollEvent、SDL_PushEvent、SDL_PeepEvents
2010年6月9日