ExampleFrameListener類詳解

來源:互聯網
上載者:User

1. OGRE的事件模型。 OGRE事件處理採用的是public subscribe mode, 即發布式訂閱模型。通常的情境如下: 對象A試圖在對象B產生C類型事件的時候 執行指定的動作,於是,對象A告知對象B當產生C類型事件的時候給自己發出一個通知。整個過程涉及到以下元素,

    *事件來源 (Event Source)。通常是GUI對象或者使用者輸入, 或者某個對象內部產生的事件。例如現在Root對象 就是一個事件來源,它從內部產生 FrameEvent事件。
*事件處理對象(Event Handler)。使用者定義的事件處理器(函數)。這裡就是我們的 ExampleFrameListener對象了。
*註冊或訂閱(registration or subscription)。將一個 事件處理對象執行個體向事件來源執行個體註冊的過程,這樣當 事件處理器對象感興趣的事件發生的時候可以立即收到通知。例如在ExampleApplication 的createFrameListener裡,
// 事件處理對象執行個體 
mFrameListener= new ExampleFrameListener(mWindow, mCamera);
...
// 向 事件來源執行個體註冊 
mRoot->addFrameListener(mFrameListener);      
* 通知函數。通常會強制要求事件處理對象實現一個名稱和參數已定的特殊方法。例如ExampleFrameListener的frameStarted和 frameEnd實現。

現在我們應該知道為什麼會有ExampleFrameListener的存在了!當Root產生 FrameEvent時ExampleFrameListener就會得到通知,即調用ExampleFrameListener的 frameStarted和frameEnd方法,給了我們一個基於幀的觸發事件介面。這也應該是和OGRE引擎其他部分互動的主要方式,選擇自己感興趣 的事件並實現對應的EventListener。

2. OGRE的InputReader對象。OGRE用InputReader對象封裝 了鍵盤、滑鼠等輸入裝置。它主要有兩種工作模式,緩衝和非緩衝,在這兩種工作方式下ExampleFrameListener獲得響應的方式有很大不同。

非 緩衝方式比較簡單,我們只需要直接建立一個InputReader對象就可以了,

       // 直接調用 PlaftformManager建立輸入裝置 
mInputDevice = PlatformManager::getSingleton().createInputReader();

       // 初 始化,與當前渲染視窗關聯 
mInputDevice->initialise(win,true, true);

獲 得輸入裝置引用後,我們就可以主動輪詢當前的裝置狀態,注意我們得到的只是當前這一刻裝置的狀態,

       // 獲得裝置當前快照
mInputDevice->capture(); 

之 後就可以檢測裝置的按鍵狀態,

       // 檢測鍵盤按鍵,KC_XXX是預定義的鍵盤掃描碼
if (mInputDevice->isKeyDown(KC_A)) ...

       // 檢 測滑鼠按鍵,參數1表示查詢第2個滑鼠按鍵,(0-左鍵,1-右鍵, 2-中鍵..)
if( mInputDevice->getMouseButton( 1 ) )

剩 下的就是根據按鍵狀態做對應的動作了。

緩衝方式的工作方式則大大的不同。在緩衝方式下,鍵盤和滑鼠的輸入不會丟失,而是會被轉換成對應的事 件儲存到隊列裡面去。看代碼,

      // 建立一個EventProcessor,EventProcessor會自動在內部建立一 個InputReader
// (輸入裝置)和一個EventQueue(事件隊列)。 輸入裝置按鍵按下的時候會產生對
// 應 的事件送入事件隊列,這就是緩衝的過程。
mEventProcessor = new EventProcessor();     

      // 在 這裡建立了InputReader和EventQueue並將兩者關聯。
mEventProcessor->initialise(win);

      // 創 建滑鼠游標
OverlayManager::getSingleton().createCursorOverlay();

      // EventProcessor 自身也是一個FrameListener對象,在這裡它把自己註冊到了Root
// 對象上面去,在frameStarted裡面獲 取裝置快照,InputReader就會將按鍵動作
// 轉換成事件提交到EventQueue裡面去。
mEventProcessor->startProcessingEvents();

      // 事 件提交到EventQueue裡面後,會按照FIFO的原則依次通知註冊到EventProcessor
// 的Listener。 ExampleFrameListener繼承了KeyListener,所以我們可以將
// ExampleFrameListener 註冊到EventProcessor上面去,按鍵事件到來的時候
// ExampleFrameListener的 keyClicked,keyPressed和keyReleased方法將會被調用()。
mEventProcessor->addKeyListener(this);

      // 獲 得輸入裝置的引用
mInputDevice = mEventProcessor->getInputReader();

所 以在緩衝方式下我們並不是主動調用InputReader的capture方法來輪訊裝置狀態,而是交給EventProcessor來緩衝按鍵事件隊 列,然後再通知ExampleFrameListener處理。在緩衝方式下還有一個不同的地方就是按鍵不再是簡單的被檢測是否按下,而是有了 Pressed和Released等不同的狀態。

3. OGRE Overlay, Overlay是一個容器物件,用來容納其他的2D和 3D元素。OGRE保證在最後才渲染Overlay對象,這樣Overlay總是出現在鏡頭的最前面,用來顯示諸如FPS和LOGO這些2D元素最合適 了。Overlay可以直接建立或者從指令檔讀入屬性來建立。在OGRE把zip打包檔案作為一個目錄來等同看待,下面建立Overlay的代碼,
mDebugOverlay = (Overlay*)OverlayManager::getSingleton().getByName("Core/DebugOverlay");
就 是從ogrenew/Samples/Media/packs目錄下的OgreCore.zip資源套件中建立了我們看到的統計資訊面板和 OGRE Logo。

瞭解了以上幾點後ExampleFrameListener的代碼就沒什麼秘密了,基本上就是在立即模式下根據鍵盤和 滑鼠按鍵更新鏡頭的位置來在3D情境中漫遊。可以注意到主要的代碼都是在虛函數processUnbufferedKeyInput裡面處理的,如果我們 在後面的demo裡面想覆蓋某些按鍵設定,只需要重載這個函數即可。下面是預設已實現的按鍵功能,

   Mouse: 漫遊
W or Up: 向 前移動
S or Down: 向後移動
A: 向左移動
D: 向右移動
PgUp: 向上移動
PgDown: 向 下移動
F: 切換FPS顯示
R: 切換渲染模式(繪製點/繪製虛線框/繪製實體多邊形)
T: 切換紋理過濾模 式(雙線過濾/三線過濾/各向異性)
P: 切換顯示鏡頭位置

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.