我们在使用laya中,或多或少会用到一些位图字体,位图字体创建的方式很多,但laya只支持导出为XML的fnt格式,而xml在微信小游戏上需要另加额外的解析库,这就导致了包大小的增加。
而位图字体导出工具并不是只能导出xml格式的字体,还可以导出成文本格式,既然这样,我们为什么不直接解析文本格式呢?
下面是我解析文本格式的代码,字体创建是通过http://kvazars.com/littera/ 这个flash字体编辑工具创建,然后导出的时候选择的Text格式。
我修改了BitmapFont.as代码,在里面加了这几个方法,最主要的是loadFontText方法。
public function loadFontText(path:String,complete:Handler):void{
_path = path;
_complete = complete;
if (!path || path.indexOf(".fnt") === -1) {
console.error('Bitmap font configuration information must be a ".fnt" file');
return;
}
Laya.loader.load([{url: path, type: Loader.TEXT}, {url: path.replace(".fnt", ".png"), type: Loader.IMAGE}], Handler.create(this, _onLoadedText));
}
/**
* @private
*/
private function _onLoadedText():void {
this.parseFontText(Loader.getRes(_path), Loader.getRes(_path.replace(".fnt", ".png")));
_complete && _complete.run();
}
public function parseFontText(text:String, texture:Texture):void {
if (text == null || texture == null) return;
_texture = texture;
var tX:int = 0;
var tScale:Number = 1;
var lines:Array = text.split('\n');
if(lines.length<5) return ;
var tInfo:Object = lineToKV(lines[0]);
fontSize = parseInt(tInfo["size"]);
var tPadding:String = tInfo["padding"];
var tPaddingArray:Array = tPadding.split(',');
_padding = [parseInt(tPaddingArray[0]), parseInt(tPaddingArray[1]), parseInt(tPaddingArray[2]), parseInt(tPaddingArray[3])];
var count:int = parseInt(lineToKV(lines[3])["count"])+4;
var i:int = 4;
for (i; i < count; i++) {
var tAttribute:Object = lineToKV(lines[i]);
var tId:int = parseInt(tAttribute["id"]);
var xOffset:Number = parseInt(tAttribute["xoffset"]) / tScale;
var yOffset:Number = parseInt(tAttribute["yoffset"]) / tScale;
var xAdvance:Number = parseInt(tAttribute["xadvance"]) / tScale;
var region:Rectangle = new Rectangle();
region.x = parseInt(tAttribute["x"]);
region.y = parseInt(tAttribute["y"]);
region.width = parseInt(tAttribute["width"]);
region.height = parseInt(tAttribute["height"]);
var tTexture:Texture = Texture.create((texture as Texture2D), region.x, region.y, region.width, region.height, xOffset, yOffset);
_maxWidth = Math.max(_maxWidth, xAdvance + letterSpacing);
_fontCharDic[tId] = tTexture;
_fontWidthMap[tId] = xAdvance;
}
}
private function lineToKV(line:String):Object{
var arr:Array = line.split(' ');
var dic:Object = new Object();
for(var i:int = 0 ;i<arr.length;++i){
var kv:Array = arr[i].split('=');
if(kv.length>1 ){
dic[kv[0]] = kv[1];
}
}
return dic;
}
使用的时候也很简单,和以前用法差不多
var bmp:BitmapFont = new BitmapFont();
bmp.loadFontText("font/font1.fnt",Handler.create(this,function():void{
Text.registerBitmapFont("myfont",bmp);
var label:Label = new Label();
label.font = "myfont";
babel.text = "test font";
Laya.stage.addChild(lable);
}));