客戶端窗口UI管理

介紹:

隨著項目系統(tǒng)玩法的逐漸豐富,原來的窗口管理方式越來越難以應付各種窗口彈出,因此有必要拓展更多的窗口類型來適應不同的玩法。
實現(xiàn)之前,參考了一下windows的窗口體系

  • Overlapped Windows 層疊窗口
  • Pop-up Windows 彈出窗口
  • Child Windows 子窗口
  • Layered Windows 分層窗口
  • Message-Only Windows

這里,只取出一些更加適用于游戲的窗口模式來討論。我們游戲的UI管理跟Windows的窗口管理有點類似,屬于多層疊窗口的UI窗口管理,可以同時支持多組的層疊窗口(多個棧)。很多一級玩法界面上面會堆疊無數(shù)個二級三級彈窗,層疊窗口的好處是,可以方便地清除相關(guān)玩法的窗口,而不影響其他玩法的層疊窗口。對于獨立的玩法窗口,這種方式工作良好。但不出多久,策劃提出了更多需求:
1.主場景界面的各種組件式的UI要提供統(tǒng)一的方式管理,如左上角主角,右上角地圖,任務提示,右下角主菜單,迷你聊天框,方向輪盤等,需要一個統(tǒng)一創(chuàng)建,銷毀和顯示隱藏的接口
2.切換場景,銷毀所有玩法窗口,切換戰(zhàn)斗,暫時隱藏窗口等
3.獨占并隱藏其他的全屏界面,可支持多個這種界面同時存在等

剛開始,我們這些需求交給各個玩法自己實現(xiàn),界面一多起來,特別是獨占全屏界面的存在,BUG叢生且難以控制,這時候我知道需要擴充更多的分類和管理行為了。

實現(xiàn):

UI層級
UI_LAYER_TOP = 9999         # 最高層基準,預留
UI_LAYER_LOADING = 9998     # 加載界面基準

UI_LAYER_TIPS = 8000        # 飄字提示基準
UI_LAYER_WORNING = 7000     # 警告框基準
UI_LAYER_DRAMA = 100        # 劇情層基準
UI_LAYER_POPUP = 50         # 二級界面基準
UI_LAYER_NORMAL = 10        # 一級界面基準
UI_LAYER_BG = -10           # 組件UI基準
UI_LAYER_BASE = -100        # 最底層基準,預留
  1. 界面的層級關(guān)系。
    我們所有的cocos ui都是掛在一個統(tǒng)一的layer,gui_layer上面的,因此,層級的控制實際上就是通過gui_layer.addChild(xx, zorder)這個函數(shù)的zorder來控制。這是目前的UI層級。

  2. 組件UI界面的管理
    我們目前的組件UI會注冊到一個組件UI管理器中,用來統(tǒng)一各個組件UI的顯示和隱藏行為。之前有單獨一篇文章提到,可參考【python弱引用來管理游戲中組件式的UI

  3. 切換場景的UI管理
    現(xiàn)在有的需求要切換場景保留或者銷毀UI,或者切換戰(zhàn)斗回來再顯示UI,由于我們的項目都繼承一個UIBase,可以在基類添加相應的狀態(tài)變量,在切換邏輯接口統(tǒng)一處理即可。如需要從競技場切入戰(zhàn)斗,戰(zhàn)斗完成時切回競技場界面,可以設(shè)置一個進入戰(zhàn)斗時是否隱藏的狀態(tài),在切換邏輯接口添加統(tǒng)一處理。

  4. 獨占型界面管理
    獨占型界面出現(xiàn)時需要隱藏其他所有界面,銷毀時顯示回來,多個獨占界面出現(xiàn)時候,根據(jù)獨占權(quán)值來調(diào)度,銷毀時同樣需要調(diào)度顯示。這里使用了一個優(yōu)先隊列來管理,權(quán)值相同則按照先入后出的規(guī)則顯示。舉個例子:權(quán)值為5的獨占界面A壓入隊列,經(jīng)過調(diào)度器優(yōu)先顯示并屏蔽其他界面,此時,權(quán)值為4的獨占界面B壓入隊列,則調(diào)度暫時隱藏,當A銷毀時,B調(diào)度顯示;如果A和B的權(quán)值相同,則后壓隊列的界面覆蓋前面的界面顯示,這都是通過優(yōu)先級隊列來調(diào)度的。
    由于我們原來已經(jīng)實現(xiàn)了一個通用的UI界面管理,因此在UI調(diào)度器就不必管理界面的生命周期了,里面對UI的引用都采用弱引用。
    在實現(xiàn)的時候,需要特別注意這4中情況:

普通界面壓棧
①已經(jīng)有獨占界面,調(diào)度器接管,即不顯示當前的普通界面
②沒有獨占界面,調(diào)度器不接管,即按照原來的顯示邏輯顯示
獨占界面壓棧
①統(tǒng)一由調(diào)度器接管,隱藏當前所有的普通界面
普通界面出棧
①已經(jīng)有獨占界面,調(diào)度器接管,即普通界面的父級不作顯示(如果有的話)
②沒有獨占界面,調(diào)度器不接管。
獨占界面出棧
①最后一個獨占界面出棧,調(diào)度器接管,展示當前所有的普通界面
②還有獨占界面,接管調(diào)度

以上功能都是隨著項目需求逐步完善的,再有更多需求可能再進行重構(gòu),在這里先整理下思路。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,030評論 25 709
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,300評論 4 61
  • Ubuntu的發(fā)音 Ubuntu,源于非洲祖魯人和科薩人的語言,發(fā)作 oo-boon-too 的音。了解發(fā)音是有意...
    螢火蟲de夢閱讀 100,671評論 9 468
  • 有人做了一張?zhí)貏e靠譜的全國高鐵線路圖!這張圖把去全國各地畫得就像坐地鐵一樣方便,突然就有了旅游和翹班的沖動,恨不得...
    戰(zhàn)敭閱讀 587評論 0 2
  • “還不睡???”季樂筱擦干凈了手,走到自己床邊坐下。 單玉謠舉了舉酒杯,“一會兒就睡?!?季樂筱聳肩,拉過被子躺下睡...
    疏星點點閱讀 252評論 0 0

友情鏈接更多精彩內(nèi)容