egret 白鷺引擎遇到的問題和解決方案


本文使用白鷺引擎版本是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下的圖片名稱/圖片全地址”),但直接從左下角拖拽進去使用資源更為省心。

我在這里遇到了兩個問題:

  1. 我的資源沒有任何顯示,后來發現是因為資源列表窗口太小,並且當時不知道窗口可以拖動
  2. 左下角拖拽無論是圖片還是紋理集都無法在測試時成功加載,總是提示是 “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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM