所謂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. [Leetcode Week8]Subsets II

    Subsets II 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/subsets-ii/description/ Description Given ...

  2. [Leetcode Week5]Word Ladder II

    Word Ladder II 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/word-ladder-ii/description/ Descripti ...

  3. Makefile之大型工程项目子目录Makefile的一种通用写法【转】

    转自:http://www.cnblogs.com/skyofbitbit/p/3680753.html 管理Linux环境下的C/C++大型项目,如果有一个智能的Build System会起到事半功 ...

  4. BZOJ 1207

    1207: [HNOI2004]打鼹鼠 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3089  Solved: 1499[Submit][Statu ...

  5. 《Java编程思想》笔记 第八章 多态

    1.向上转型 把子类引用当作父类引用.(子类对象赋值给父类引用) 2.绑定 确定方法属于哪个类. 3.前期绑定 程序执行前绑定. 4.后期绑定也叫动态绑定 程序运行时绑定. 5.多态 多个不同的对象对 ...

  6. docker 安装持久化mysql

    https://hub.docker.com 拉取mysql镜像docker pull mysql:5.5运行mysql镜像并持久化到本地docker run -v /var/own/mysqldat ...

  7. redis发布订阅、HyperLogLog与GEO功能的介绍

    一.发布订阅 1.模型 发布者发布消息,订阅者接收消息 2.API 2.1.publish 2.2.订阅 2.3.取消订阅 unsubsribe 2.4.其他api 二.HyperLogLog 极小空 ...

  8. docker官方文档中的dns,link,expose,publish

    link是过时的了,尽量不要用. dns内部集成,也可以用外部. expose只是用于记录,并不真的. publish是否起作用,也要看情况,是否被占用端口. -------------------- ...

  9. Servlet 调用过程

    上图的大概意思: 前台输入访问路径后,浏览器会去访问本地的host文件查询有木有与之匹配域名的IP地址,若无则在访问DNS服务器查询与之匹配的IP地址.解析IP后则开始发起HTTP请求,根据请求中的基 ...

  10. 洛谷 P1583 魔法照片【二级结构体排序】

    题目描述 一共有n(n≤20000)个人(以1--n编号)向佳佳要照片,而佳佳只能把照片给其中的k个人.佳佳按照与他们的关系好坏的程度给每个人赋予了一个初始权值W[i].然后将初始权值从大到小进行排序 ...