所謂BitmapFont,就是事先將我們會用到的字型,會用到的字,輸出成一張圖片,類似Sprite sheet,以及一個xml格式的Data file,然後我們一次將這文字圖片轉成Texture,upload到GPU,當我們要用到某個文字時,再利用Data file對照將Texture貼上。這樣做的好處是比起我們動態的去產生文字的Texture,BitmapFont只做一次upload Texture到GPU的動作,之後重複利用這個Texture,GPU的負擔比較小;相對的,如果我們動態去產生文字的Texture,upload到GPU的次數多,GPU的cost就比較大。缺點是要先決定我們會用到哪些字?最大的字級多少?圖片儲存文字檔案也比較大。

要產生BitmapFont,我們也需要一些工具,Mac使用者可以使用Glyph Designer,還可以用在iOS的開發上,也有一堆特效可以用。$29.99美金。Windows使用者可以用Bitmap Font Generator,免費,但介面跟功能也陽春許多。我們先下載Bitmap Font Generator來練習。

下載安裝完,打開Bitmap Font Generator,右邊可以勾選要輸出的字元。左上角Options點開,第一個Font settings,選擇字型,Charset選Unicode,設定Size:

接著選Options的第二個Export options,Spacing至少2,以免之後Texture貼圖時切到其他文字。寬高要自己手動設定,最好是2的次方,設定太大浪費檔案空間,太小會被切成多個圖檔,這邊要依照實際要輸出的文字多少來調整。ARGB四個Channel預設選項是甚麼我忘記了。Font descriptor選擇XML,Textures選PNG:

Options第三個Visualize可以預覽輸出的圖檔,若是圖檔大小有問題就可以回去修改:

最後我們選Options第四個Save bitmap font as...先儲存一個.fnt檔,基本上就是一個.xml檔案,我們先命名成bitmapFont.fnt。圖片會自動儲存成bitmapFont_0.png。如果圖片不只一張,表示圖片尺寸設定太小,請重新調整再輸出。

我們在剛剛選擇字型時用了Futura Bk,為了跟原來的Futura Bk區別,可以打開bitmapFont.fnt,將info裡的face改成My Futura Bk。然後我們就可以進入程式部分:

publicclassGame8extendsSprite
{
privatevar _container:Sprite;
[Embed(source ="/assets/bitmapFont.fnt", mimeType="application/octet-stream")]
privatestaticconstBitmapCharsXML:Class;//embed Data file
[Embed(source ="/assets/bitmapFont_0.png")]
privatestaticconstBitmapChars:Class;//embed png

publicfunctionGame8()
{
super();
addEventListener(Event.ADDED_TO_STAGE, init);
}

privatefunction init(e:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);

_container =newSprite();
addChild(_container);
addChild(newStats());

var bitmap:Bitmap=newBitmapChars();
var texture:Texture=Texture.fromBitmap(bitmap);//將字型圖片轉為texture
var xml:XML = XML(newBitmapCharsXML());//將Data file轉成xml

TextField.registerBitmapFont(newBitmapFont(texture, xml));//註冊BitmapFont

var text:TextField=newTextField(500,500,"Hello, BitmapFont","My Futura Bk",100);//新增一個TextField,字型設為我們自定的My Futura

Bk,大小故意設定大於BitmapFont的最大size
text.x =(stage.stageWidth - text.width)>>1;//設定text座標
text.y =(stage.stageHeight - text.height)>>1;//設定text座標
//text.fontSize = BitmapFont.NATIVE_SIZE;//這個設定可以讓字型大小變成原本BitmapFont設定的大小
text.color =0xFF00FFFF;//設定顏色ARGB

_container.addChild(text);//將text加到場景上
}
}

將圖片embed進來,轉成texture,Data file轉成xml,接著就可以註冊一個BitmapFont:

TextField.registerBitmapFont(new BitmapFont(texture, xml)); 

之後要使用這個BitmapFont就跟一般TextField用法一樣。我們故意新增一個字級很大的TextField,如果這樣發佈結果文字糊糊的,表示成功使用了圖片的資料;反之如果還是很平滑銳利,就表示BitmapFont沒有設定成功。如果確定成功的話再把fontSize改回來,只要小於或等於原本我們設定的BitmapFont大小顯示出來的文字就沒問題。另外可以用這個方式將字級大小設定成BitmapFont的原始大小:

text.fontSize = BitmapFont.NATIVE_SIZE; 

Demo如下:

點我或圖看Demo

一起來玩鳥 Starling Framework(8)BitmapFont的更多相关文章

  1. 一起來玩鳥 Starling Framework 簡介

    開場 Starling Framework是一套Flash 2D遊戲開發"工具",是使用Flash最新的Stage3D API建構出來的一套Framework.最大優點在於使用GP ...

  2. 一起來玩鳥 Starling Framework(5)Multi-Touch

    這篇來談談Starling的Multi-Touch.前一篇也提到,Multi-Touch一樣是監聽TouchEvent.TOUCH,然後由TouchEvent的e.getTouches()取回多點的資 ...

  3. 一起來玩鳥 Starling Framework(2)效能測試以及Image與Texture

    上一篇我們放了一個Quad與TextField在舞台上慢慢轉.眼尖的可能會發現轉起來邊緣有點鋸齒,這可以透過設定Starling的反鋸齒來解決,在Main.as裡,新增了_starling之後,可以加 ...

  4. 一起來玩鳥 Starling Framework(1)一定要的Hello World!

    雖然已經一堆Hello World的介紹文章跟影片了,但中文資料畢竟是比較少,所以不能免俗的來一篇中文版Hello World.首先開啟一個AS3.0專案,fps不用客氣,設為60,Starling很 ...

  5. 一起來玩鳥 Starling Framework(7)MovieClip

    承上一篇,我們接著來講最後一個IAnimatable類別,MovieClip.Starling的MovieClip跟native的MovieClip不太一樣,它只能接收一個Vector.<Tex ...

  6. 一起來玩鳥 Starling Framework(3)Button!

    週末夜來介紹個簡單的DisplayObject就好.不論是在電腦上或行動裝置上,跟使用者互動次數最多的,大概就是按鈕了.因此,Starling有個Button類別,來做出這個常用的互動元件. 同樣是因 ...

  7. 一起來玩鳥 Starling Framework(9)Particle

    最後,來看看Starling裡一個很炫的功能:Particle.Particle屬於extension,所以要另外下載檔案:Starling-Extension-Particle-System.下載之 ...

  8. 一起來玩鳥 Starling Framework(6)Juggler、Tween、以及DelayCall

    這篇開始來講Starling裡的Animation.Juggle是個簡單的Class,用來控制動畫的進行.他負責管理經由add()加進來的實現IAnimatable介面的物件,然後當Juggler的a ...

  9. 一起來玩鳥 Starling Framework(4)TouchEvent,Touch,以及TouchPhase

    這一篇來介紹一下TouchEvent.我們先來談單點的touch,下一篇再介紹MultiTouch.翻過Starling文件的應該會發現,Starling裡面沒有MouseEvent,而是整合在Tou ...

随机推荐

  1. Chubby lock service for distributed system

    Chubby lock service在分布式系统中的应用 Chubby lock service在分布式系统中提供粗粒度的锁服务, 以及可靠的存储. 相比高性能, 设计的重点在于高可靠性和高可用性. ...

  2. windows下nginx安装及使用

    nginx简介: nginx是一款轻量级web服务器,也是一款反向代理服务器(比如域名转发等). nginx功能: 1.可直接支持Rails和PHP的程序. 2.可作为HTTP反向代理服务器. 3.作 ...

  3. [ 总结 ] Linux 下文件描述符

    1.概述: 文件描述符是内核为了高效管理已被打开的文件所创建的索引.是一个非负整数,用于代指被打开的文件.所有通过I/O操作的系统调用都通过文件描述符. 文件描述符用以表明每一个被进程所打开的文件和s ...

  4. 【SQL】服务器环境下的SQL

    一.大型数据库的三层体系结构 web服务器:比如在淘宝页面上,输入“牛肉干”,就是web服务器来处理,提交给应用服务器. 应用服务器:在获取到“牛肉干”这个请求后,应用服务器决定如何汇集结果,并进行相 ...

  5. selenium3+python自动化50-环境搭建(firefox)【转载】

    前言 有不少小伙伴在安装selenium环境后启动firefox报错,因为现在selenium升级到3.0了,跟2.0的版本还有有一点区别的. 安装环境过程中主要会遇到三个坑: 1.'geckodri ...

  6. python类的__new__和__init__

    python的类,和其他语言有一点不太一样,就是,他把新建一个类和初始化一个类,分成了两个方法: __new__ __init__ 当然,想想就知道,肯定是__new__先发生,然后才是__init_ ...

  7. opencv inrange 和 mix

    opencv inrange: http://blog.csdn.net/xiaoyufei117122/article/details/53572904 http://blog.csdn.net/w ...

  8. 大话PHP设计模式

    设计模式 一书将设计模式引入软件社区,该书的作者是 Erich Gamma.Richard Helm.Ralph Johnson 和 John Vlissides Design(俗称 “四人帮”).所 ...

  9. 《Machine Learning》(第一章)序章

    关键词:机器学习,基本术语,假设空间,归纳偏好,机器学习用途 一.机器学习概述 机器学习是一门从数据中,经过计算得到模型(Model)的一种过程,得到的模型不仅能反应出训练数据集中所蕴含的规律,并且能 ...

  10. Codeforces Round #394 (Div. 2) E. Dasha and Puzzle(分形)

    E. Dasha and Puzzle time limit per test 2 seconds memory limit per test 256 megabytes input standard ...