本文使用白鷺引擎版本是5.2.7 當前時間最新版 (截圖時又出現了一版,迭代速度還是很快的)
![]()
1. 選擇游戲開發模版
一定要選擇ui模版,而不要選擇game面板
game模版刪去了theme和eui部分組件,如果你想自定義ui,還需要手動創建一個default.thm.json文件,挺麻煩的,因為他有自己專有格式,所以請盡量選擇ui開發,一樣可以開發游戲
game模版不包括紅線范圍內的文件
![]()
2. Main.ts 代碼刪除要小心
ui項目 Main基於 eui.UILayer
game項目 Main基於 egret.DisplayObjectContainer
兩個的區別在於game項目使用事件偵聽來監控場景加載到舞台上
this.once(egret.Event.ADDED_TO_STAGE, this.onAddToStage, this);
而ui項目使用createChildren函數
3. 心跳
不可刪,非內存回收,是用於在后台時對內核更新暫停。
egret.lifecycle.addLifecycleListener((context) => { // custom lifecycle plugin }) egret.lifecycle.onPause = () => { egret.ticker.pause(); } egret.lifecycle.onResume = () => { egret.ticker.resume(); }
4. 資源映射
不可刪除,用於default.res.json中字符串與文件路徑間的映射關系
let assetAdapter = new AssetAdapter(); egret.registerImplementation("eui.IAssetAdapter", assetAdapter); egret.registerImplementation("eui.IThemeAdapter", new ThemeAdapter());
刪除這三句將無法使用eui和exml功能,打亂exml加載時序等諸多問題。筆者誤刪導致麻煩還真不少。
5. async和 await
成對出現,用於異步加載並入同步隊列中,讓需要事件判斷的api變為順序加載的api,也就是加載成功/失敗后才會繼續執行之后的語句。
6. 創建eui 和創建 exml
首先egret wing開發程序是有界面編輯器的,一臉懵逼的我找了半天,發現新建exml就是界面編輯器,而直接創建eui時可以包含exml,而且這樣做可以不設置eui的skinName,因為創建的時候,他們之間已經在default.thm.json中相互關聯了, 之后創建這個類,就會自動加載其對應的exml皮膚。
7. exml 使用圖片和json打包圖問題
exml界面編輯是可以使用json打包圖片和散圖的,方法是從左下角的資源目錄查找,此資源目錄列表來源於default.res.json內的preload內容(默認main是加載preload的),有需要用到的資源需要在這里配置。另外,圖片等的資源可以手動寫(source = “preload下的圖片名稱/圖片全地址”),但直接從左下角拖拽進去使用資源更為省心。
我在這里遇到了兩個問題:
- 我的資源沒有任何顯示,后來發現是因為資源列表窗口太小,並且當時不知道窗口可以拖動
- 左下角拖拽無論是圖片還是紋理集都無法在測試時成功加載,總是提示是 “ip地址+紋理名稱” 找不到鏈接的問題,其實是上面第四大點提到的資源映射代碼讓我刪掉了導致的。。。。。
我最初的解決方案很蠢,紋理無法正常加載,就直接把圖片的實際資源地址手寫到source里面,雖然能正常顯示,但是治標不治本。
8. 資源id的調用
在之前代碼誤刪導致的問題中,這里也體現出來,partAdded在childrenCreated之后加載,導致無法正常處理內部對象。(內部對象直接在eui界面類創建對象id名對應的變量,在之后可以直接調用)
這里我在錯亂的邏輯中繼續錯亂,在eui界面類中加入了個timer用於延遲偵聽partAdded完全加載完畢的完成事件,表面上看起來和正常邏輯代碼跑到childrenCreated是一樣的。但是這種方法治標不治本,還是需要將第四大點修復,才能有效解決這個時序問題。
9. 顯示位置出錯
創建很多displaycontainer+bitmap對象后會導致無法正常顯示,或者影響其他代碼對象顯示錯亂問題
這時候我將大量創建顯示對象的函數放到場景創建的最后一環進行,暫時避免了這個問題。
10. eui類庫和egret類庫關系
egret類庫是白鷺最基本的類庫,eui是銜接了exml組件皮膚封裝的顯示類egret擴展。eui所有對象都可以被addChild。
11. Tween的問題
在測試過程中,egret雖然可以通過心跳暫停刷新,但是貌似某些情況下Tween內部還是在跑動,導致恢復時tween動畫會跳到一個奇怪的地方。
也許和測試環境有關系,在電腦端呈現的錯誤在手機端未復現
12. 事件和Tween疊加使用。
當在事件內部使用Tween並調用call來響應完成事件時,事件evt傳遞參數並不能一直駐留在內存里,當call執行時,evt已經被回收了。如果想有效的使用evt的內容,將evt的內容通過call的第三個參數方式傳遞給call,evt本身不可以傳遞進去,因為事件完成輪詢后會強制回收evt。
轉發於:https://www.jianshu.com/p/4ca22d734831
