上一頁 | 首頁

SDL_Event

章節:SDL API 參考 (3)
更新2001年9月11日 星期二 22:59
索引
 

名稱

SDL_Event - 總事件結構  

結構的定義

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;

 

結構的內容

type
事件的類型
active
激活事件
key
鍵盤事件
motion
鼠標移動事件
button
鼠標按鈕事件
jaxis
控制桿軸移動事件
jball
控制桿追蹤球移動事件
jhat
控制桿帽移動事件
jbutton
控制桿按鈕事件
resize
應用程序窗口調整大小事件
expose
應用程序窗口暴露事件
quit
應用程序退出請求事件
user
用戶自定義事件
syswm
未定義窗口管理器事件
 

描述

SDL_Event聯合是SDL中事件處理的核心,它可能是除SDL_Surface之外最重要的結構。SDL_Event是SDL中所有事件結構的聯合。通過它,可以輕易知道聯合成員與事件類型的對應關系。

事件類型
事件結構
SDL_ACTIVEEVENT
SDL_ActiveEvent
SDL_KEYDOWN/UP
SDL_KeyboardEvent
SDL_MOUSEMOTION
SDL_MouseMotionEvent
SDL_MOUSEBUTTONDOWN/UP
SDL_MouseButtonEvent
SDL_JOYAXISMOTION
SDL_JoyAxisEvent
SDL_JOYBALLMOTION
SDL_JoyBallEvent
SDL_JOYHATMOTION
SDL_JoyHatEvent
SDL_JOYBUTTONDOWN/UP
SDL_JoyButtonEvent
SDL_QUIT
SDL_QuitEvent
SDL_SYSWMEVENT
SDL_SysWMEvent
SDL_VIDEORESIZE
SDL_ResizeEvent
SDL_VIDEOEXPOSE
SDL_ExposeEvent
SDL_USEREVENT
SDL_UserEvent
 

用法

SDL_Event structure有兩種用法

*
從事件隊列中讀取事件
*
將事件放入事件隊列

可以通過SDL_PollEventSDL_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_eventtype成員中。因此,我們使用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_PushEventSDL_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_PollEventSDL_PushEventSDL_PeepEvents  

譯者

石仔<guoshimin57@gmail.com>  

中文版主頁

http://guoshimin.users.sf.net  

中文版最後更新時間

2010年6月9日


 

索引

名稱
結構的定義
結構的內容
描述
用法
另見
譯者
中文版主頁
中文版最後更新時間