基於OgreBites::Widget 實現自己的GUI系統(2)

今天寫了自己的OEGUISystem類

這個類功能主要如下:

1 管理鼠標.鼠標的外觀顯示使用了一個OECursor類來管理.如果不關心自己創建鼠標的外觀,OEGUISystem默認實現ogre sample中的那個鼠標外觀.

 

2 管理事件.OEGUI事件的觸發和CEGUI類似,調用::OEGUISystem::getSingleton().inject***().函數返回true 表示 鼠標位置正處於某個Widget上方.不管這個widget響不響應對應的事件,OEGUI認爲只要鼠標在某個Widget上方,則 這個Widget獲得焦點,並且不在對後繼的Widget進行窗口的事件注入.

 

3 管理焦點.對失去焦點的widget,將調用_focusLost().

 

4 窗口和Widget管理.OEGUI並沒有實現create方法,而是實現了一個registerWindow()方法,這個方法在窗口的構造函數中調用,把自己註冊到System中來,只有註冊了的窗口才能實現事件的注入.OEGUI對註冊了的窗口按照zorder進行排序,當zorder在上的窗口獲得事件處理後,將不在對後繼的窗口注入事件.

 

5 動態外觀管理.widget的外觀由2部分組成.一個是默認外觀,這個外觀的設置在overlay腳本中設置.另一個外觀是運行中對不同狀態響應的外觀.這部分外觀widget中源代碼寫死了,爲了實現動態外觀的管理,把動態外觀的材質名稱獨立出來作爲OEGUISystem的一個參數,各個widget初始化時從OEGUISystem中獲得這部分參數,從而實現動態外觀的管理.需要注意的是每個widget仍然保留了這個參數的一個副本,這樣可以實現相同類型Widget的不同實例擁有不同的外觀.從目前幾個widget實現來看,只有少數幾個Widget才受影響.如果需要改變基礎顯示,應該在腳本中改變材質.

 

6 鍵盤輸入管理.這部分是sdktray的空白.目前基礎功能已經實現了.我的鍵盤管理沒有放到OEWindows,而是統一在OEGUISystem中實現.system中保留一個獲得鍵盤焦點的Widget指針,當有鍵盤輸入的時候,調用鍵盤焦點的回調函數.我對鍵盤焦點獲得的判定是根據鼠標.當鼠標在某個Widget上面點擊的時候,則這個Widget同時獲得鍵盤焦點.在這個基礎上,我實現了一個EditBox,實現鍵盤輸入.EditBox使用一個函數來過濾不必要的文字輸出.比方說F1 Shift等按鍵不屬於"正常"文字的按鍵都被過濾掉了.不過如果重寫這個函數的話,也可以實現諸如按下A輸出B之類的效果.  這些有關文字的操作主要使用的Ogre::DisplayString 這個類的接口.EditBox基本功能已經實現,但是還不是很完善,一個是一般遊戲中的聊天框字體都是從下開始顯示的,這個Box是從上顯示的,需要獲得更改,其次也還沒有實現光標的跟隨.這些明天來實現.其次,對沒有獲得鍵盤焦點的widows的事件響應,計劃使用熱鍵的形式來實現.System中維護一個熱鍵的表,一個特定的按鍵對應一個特定的widows,當檢測到特定的按鍵時,調用對應windows的回調函數.

 

明天寫完這些功能,再搞定中文輸入,代碼估計就可以打包放上來了.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章