介紹:
隨著項目系統(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 # 最底層基準,預留
界面的層級關(guān)系。
我們所有的cocos ui都是掛在一個統(tǒng)一的layer,gui_layer上面的,因此,層級的控制實際上就是通過gui_layer.addChild(xx, zorder)這個函數(shù)的zorder來控制。這是目前的UI層級。組件UI界面的管理
我們目前的組件UI會注冊到一個組件UI管理器中,用來統(tǒng)一各個組件UI的顯示和隱藏行為。之前有單獨一篇文章提到,可參考【python弱引用來管理游戲中組件式的UI】切換場景的UI管理
現(xiàn)在有的需求要切換場景保留或者銷毀UI,或者切換戰(zhàn)斗回來再顯示UI,由于我們的項目都繼承一個UIBase,可以在基類添加相應的狀態(tài)變量,在切換邏輯接口統(tǒng)一處理即可。如需要從競技場切入戰(zhàn)斗,戰(zhàn)斗完成時切回競技場界面,可以設(shè)置一個進入戰(zhàn)斗時是否隱藏的狀態(tài),在切換邏輯接口添加統(tǒng)一處理。獨占型界面管理
獨占型界面出現(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),在這里先整理下思路。