我這里使用的是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腳本就可以了。