Laya位圖字體的坑


我這里使用的是As

生成字體的方法可以參考官方文檔,我這里說下遇到的幾個坑

1、只能根據已有某些字體生成,不能用美術自己設計的文字,並且生成后的字體不能更改顏色,想要改顏色的話只能在BMfont中設置

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2、導入LayaIDE中,發布后會生成圖片對應的圖集和fnt,但事實上預加載圖集的時候會找對應名稱.PNG的圖片,所以可以在IDE中設置圖片為不打包,然后手動將圖片復制到h5下fnt所在文件目錄。

3、文檔最后一句說“在程序代碼里實例化使用了位圖字體的頁面之前,需要先創建並注冊頁面內使用到的位圖字體”

 1 private var numberFont:BitmapFont;
 2         
 3 private function preLoad():void 
 4 {
 5     numberFont = new BitmapFont();
 6     numberFont.loadFont("bitmapFont/number.fnt", Handler.create(this, fontLoaded));
 7 }
 8         
 9 private function fontLoaded():void 
10 {
11     Text.registerBitmapFont("number", numberFont);
12 }

這里如果有多個字體,就要創建多個BitmapFont。

4、如果游戲要發布到微信,在LayaIDE中運行是沒問題的,但是到微信中會報“gameThirdScriptError”的錯誤。是解析XML的問題,需要下載文件導入工程,然后在修改微信中的game.js

 

1 require("weapp-adapter.js");
2 window.Parser = require("./dom_parser.js");
3 require("./code.js");

 5、如果需要向子域傳數據,也就是MiniAdpter.init(true)第一個參數傳true的時候,會把位圖字體的XML文件當成JSON給傳到子域,然后解析報錯,目前還沒找到解決辦法,各種坑。。。。

 

最后,一個終極的解決辦法,不用自帶的位圖字體,自己封裝一個,啥問題都不是問題了,爽歪歪。。。

LayaIDE中右鍵新建腳本:

我這里命名為BMFont,會自動生成一個BMFont.prop文件,加入需要的幾條數據

<prop name="text" tips="文字" type="string"/>
<prop name="txtWidth" tips="文字寬度" type="number"/>
<prop name="txtHeight" tips="文字高度" type="number"/>
<prop name="txtSkin" tips="公共資源" type="string"/>
<prop name="space" tips="間隔" type="number"/>
<prop name="txtAlignment" tips="對齊方式" type="option" option="left,center,right"/>

然后新建一個Tools.BMFont.as文件,代碼如下:

  1 package Tools 
  2 {
  3     import laya.ui.Box;
  4     import laya.ui.Image;
  5     
  6     /**
  7      * ...
  8      * @author NewTest
  9      */
 10     public class BMFont extends Box 
 11     {
 12         
 13         public function BMFont() 
 14         {
 15 
 16         }
 17         
 18         
 19         
 20         private var _text:String;
 21         
 22         public function get text():String 
 23         {
 24             return _text;
 25         }
 26         
 27         public function set text(value:String):void 
 28         {
 29             if (_text != value) 
 30             {
 31                 _text = value;
 32                 var arr:Array = checkChildren(value.length);
 33                 
 34                 if (_text.length > 0) 
 35                 {
 36                     space = space ? space : 0;
 37                     txtWidth = txtWidth ? txtWidth : (arr[0] as Image).source.width;
 38                     txtHeight = txtHeight ? txtHeight : (arr[0] as Image).source.height;
 39                     setPos(_text, arr);
 40                 }
 41                 
 42             }            
 43         }
 44         
 45         public var txtWidth:Number;        
 46         public var txtHeight:Number;    
 47         public var txtSkin:String;
 48         private var _space:Number;
 49         public var txtAlignment:String;
 50         
 51         public function get space():Number
 52         {
 53             return _space;
 54         }
 55         public function set space(value:Number):void 
 56         {
 57             _space = value;
 58             setPos(text, checkChildren(text.length));
 59         }
 60 
 61         
 62         //檢查要顯示的圖片.
 63         private function checkChildren(count:int):Array 
 64         {
 65             var arr:Array = [];            
 66             
 67             for (var i:int = 0; i < this._childs.length; i++) 
 68             {
 69                 var chi:Image = this._childs[i];
 70                 if (i < count) 
 71                 {                    
 72                     chi.visible = true;
 73                     arr.push(chi);
 74                 }
 75                 else 
 76                 {
 77                     chi.visible = false;
 78                 }
 79             }
 80             if (arr.length < count) 
 81             {
 82                 for (var j:int = arr.length; j < count; j++) 
 83                 {
 84                     var chi:Image = new Image();
 85                     this.addChild(chi);
 86                     arr.push(chi);
 87                 }
 88             }
 89             return arr;
 90         }
 91         
 92         //設置圖片位置.
 93         private function setPos(str:String, arr:Array):void 
 94         {
 95             var startX:Number = 9999;
 96             for (var i:int = 0; i < arr.length; i++) 
 97             {
 98                 var img:Image = arr[i] as Image;
 99                 img.skin = txtSkin + str[i] + ".png";
100                 
101                 img.width = txtWidth;
102                 img.height = txtHeight;
103                 if (txtAlignment == "left") 
104                 {
105                     img.pivotX = 0;    
106                     var totalWidth:Number
107                     img.x = i * img.width + space * i;
108                     
109                 }
110                 else if (txtAlignment == "right") 
111                 {
112                     img.pivotX = img.width;
113                     var x:Number = arr.length - i - 1;
114                     img.x = -x * img.width - space * x + this.width;
115                 }
116                 else 
117                 {
118                     img.pivotX = 0;
119                     if (startX == 9999) 
120                     {
121                         startX = this.width * 0.5 - (arr.length * txtWidth + (arr.length - 1) * space) * 0.5;
122                     }
123                     img.x = startX + i * img.width + space * i;
124                 }
125             }
126         }
127         
128     }
129 
130 }

使用時,只需要新建一個Box,然后拖上BMFont腳本就可以了。

 


免責聲明!

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



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