# Pixi v5+fairyGUI --- ## v5.1 to v5.3 ### release note * [v5.2.0](https://github.com/pixijs/pixijs/releases/tag/v5.2.0) * [v5.3.0](https://github.com/pixijs/pixijs/releases/tag/v5.3.0) ### 取得 v5.3.x library :::info [官方github](https://github.com/pixijs/pixijs/tree/v5.3.x) 並未直接提供 library 輸出後的檔案 這裡先自行開空白專案, 然後安裝 pixi, 把相關檔案取出來 ```nodejs npm install pixi.js@5.3.11 ``` 再去 node_module 裡面把 pixi.js, pixi.js.map, pixi.js.d.ts 這三個檔案抓出來 ::: ### 升級疑難排解 :::danger {font:"30px JLC_numbers", align: "left" } :::success {fontName:"JLC_numbers", fontSize:30, align: "left" } ::: :::danger PIXI.Texture.fromCanvas(canvas) :::success PIXI.Texture.from(canvas) ::: :::danger PixiJS Deprecation Warning: PIXI.Loader#on is completely deprecated, use PIXI.Loader#onProgress.addDeprecated since v5.0.0 :::success 改用 loader.onProgress.add(callback) ::: :::danger loader.once('complete', this.exist, this); :::success loader.onComplete.once(callback); ::: :::danger 移除 listener 的方法 :::success ```typescript= const bindingObj = loader.onComplete.add(()=>{}); loader.onComplete.detach(bindingObj); ``` ::: --- ## 設定 tsconfig :::info 加上 typings 資料夾, text editor 才能辨認 d.ts ::: ```json= "exclude": [ "node_modules", "libs/*" ], "include": [ "typings/*", ] ``` --- ## 開始導入 fairyGUI :::info 使用 [第三方版本 v5.3.x](https://github.com/kevinchen2046/fairygui-pixijs-v5) ::: ### 必要 library | library | 目標資料夾 | 用途 | | -- | -- | -- | | [rawinflate.js](https://github.com/imaya/zlib.js/blob/develop/bin/rawinflate.min.js) | libs | runtime 解壓縮 fui 檔案 | | fairygui.js | libs | | | fairygui.d.ts | typings | | ### 修正第三方 fairygui 的 bug :::warning fairygui.js 這裡的用法有誤: detach() 是用來解除事件, 而且必須要丟 signal 物件進去 但實際上這段在父類別 PIXI.Loader 是觸發完成的事件 ```javascript= AssetLoader.prototype._onComplete = function () { AssetLoader.addResources(this.resources); //this.onComplete.detach(this); this.onComplete.dispatch(this, this.resources); }; ``` ::: --- ## 合併 library ### 必要 package | package | 用途 | | -- | -- | | webpack-merge-and-include-globally | 將所有 js lib 和專案合併在同一個檔案 | | @babel/runtime | 上述套件需要使用 | | uglify-js | 合併 js 進行最小化 | ### 設定 jsconfig ```javascript= { "javascript": [ "./libs/rawinflate.min.js", "./libs/pixi.js", "./libs/fairygui.js" ] } ``` ### webpack 設定所有 library 合併成單一檔案 :::info 此部分會透過 webpack-merge-and-include-globally 和 @babel/runtime 將所有外部 js library 打包成單一檔案, 並且解決無法辨認相依 js 的問題 ::: * webpack.config 設定範例 ```javascript= const MergeIntoSingle = require('webpack-merge-and-include-globally'); const json = require('./jsconfig.json'); const config = { plugins: { new MergeIntoSingle({ files: { "game.bundle.js": json.javascript }, transform: { "game.bundle.js": code => require("uglify-js").minify(code).code } }) } } ``` --- ## fairyGUI 設定 * project type 選擇 pixi * publish 的 package format 不能勾選 binary format, 否則 runtime 解壓縮會失敗 --- ## sample ```typescript= private fguiInit() { fgui.GRoot.inst.attachTo(this.game["_app"], { designWidth: 1280, designHeight: 720, scaleMode: fgui.StageScaleMode.FIXED_WIDTH, orientation: fgui.StageOrientation.LANDSCAPE, alignV: fgui.StageAlign.TOP, alignH: fgui.StageAlign.LEFT }); this.loadFguiRes(); } private loadFguiRes() { const loader = new fgui.utils.AssetLoader(); loader.add("Package1", "assets/fgui/test.fui", { loadType:PIXI.LoaderResource.LOAD_TYPE.XHR, xhrType: PIXI.LoaderResource.XHR_RESPONSE_TYPE.BUFFER }) .load((loader, resources)=>{ fgui.UIPackage.addPackage("Package1"); const obj = fgui.UIPackage.createObject("Package1", "Component1"); fgui.GRoot.inst.addChild(obj); }); } ``` --- ###### tags: `PixiJS`