laya 位图字体

我们在使用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);
}));

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值