fnt 图字原理
?首先要介紹一下,圖字是怎么來的?其實(shí)這個很早很早了,記得80后在95年開始玩DOS下的仙劍奇?zhèn)b傳的時候,那些令人難忘的中文對話吧!DOS下做游戲,使用的是C語言,不要說寫字了,很多復(fù)雜的操作甚至涉及驅(qū)動。那時候繪圖就是利用將圖片中的像素取出來后繪制在屏幕上,所以處理游戲中的中文,就只有把這些文字的像素預(yù)先寫到BMP或二進(jìn)制文件中,然后讀取出來再設(shè)置屏幕像素以實(shí)現(xiàn)。后來進(jìn)入DDRAW的時代,可以使用WINDOWS系統(tǒng)中的字庫來寫字了。把DDRAW的后臺表面進(jìn)行LOCK,取出其DC,然后用GDI將文字寫到其DC上,這種做法后面也延續(xù)了很久,但GDI進(jìn)行TextOut的效率非常慢,你要是想像夢幻西游一樣滿屏寫了,那得卡死,解決方案是什么?還是圖字。專業(yè)的游戲開發(fā)者會將所用到的字都預(yù)處理生成到一張圖片中,通過一個編碼與紋理UV對應(yīng)文件來進(jìn)行紋理UV的獲取后做為頂點(diǎn)的UV值然后進(jìn)行繪制,有也的在每一幀中實(shí)時的將需要的字使用DDRAW寫字的方法繪制到相應(yīng)的紋理上然后使用文字編碼與紋理UV對應(yīng)信息來進(jìn)行繪制,這樣效率就提高很多了。目前比較流行的做法是使用一張png圖片來存儲用到的文字。一個.fnt文件來存儲文字圖片說明信息。Cocos2d-x和LibGdx中都集成了相關(guān)的圖字處理類。在世界范圍內(nèi),也有很多游戲使用了這個方案。
??????? 我們以Cocos2d-x的tests工程中的LabelTest中的最后一個Label顯示“中國”為例來分析一下。
??????? 打開Cocos2d-x所在目錄下的tests\Resources\fonts目錄,找到bitmapFontChinese.png(文字貼圖文件)和bitmapFontChinese.fnt(文字圖片說明信息文件)?www.2cto.com
??????? 先打開png,我們可以看到它是512x512大小,上面由12行,14列個文字組成。包括有一些漢字,常用字符,數(shù)字和字母。它的每個字都是由青色到藍(lán)色的向下漸變。
??????? 再用UEdit或記事本打開bitmapFontChinese.fnt,可以看到它的構(gòu)成,我在這里講一下。
第一行是對字體的介紹。
info face="華康海報(bào)體W12(P)" size=32 bold=0italic=0 charset="" unicode=0stretchH=100smooth=1 aa=1 padding=0,0,0,0 spacing=1,1
解釋:
face="華康海報(bào)體W12(P)":字體為”華康海報(bào)體W12(P)”,
size=32:大小為32像素
bold=0 :不加粗
italic=0:不使用斜體
charset="": charset是編碼字符集,這里沒有填寫值即使用默認(rèn),
unicode=0:不使用Unicode
stretchH=100:縱向縮放百分比
smooth=1 :開啟平滑
aa=1:開啟抗鋸齒
padding=0,0,0,0:內(nèi)邊距,文字與邊框的空隙。
spacing=1,1 :外邊距,就是相臨邊緣的距離。
?
第二行是對應(yīng)所有字貼圖的公共信息
common lineHeight=37 base=28 scaleW=512 scaleH=512pages=1 packed=0
解釋:
lineHeight=37:行高,如果遇到換行符時,繪制字的位置坐標(biāo)的Y值在換行后增加的像素值。
base=28 :字的基本大小
scaleW=512 :圖片大小
scaleH=512:圖片大小
pages=1 :此種字體共用到幾張圖。
packed=0:圖片不壓縮
?
第三行是對應(yīng)當(dāng)前字貼圖的信息
//第一頁,文件名稱是”bitmapFontChinese.png”
page id=0 file="bitmapFontChinese.png"
?
第四行是當(dāng)前貼圖中所容納的文字?jǐn)?shù)量
chars count=204
?
第五行起把當(dāng)前貼圖中所用到的所有文字的編碼以及對應(yīng)在圖片上的矩形位置,偏移等列出來
第一個字符編碼為32,也就是空格,位置為0,0,寬高為0,0, 繪制到屏幕的相應(yīng)位置時,像素偏移(0,28),繪制完后相應(yīng)位置的x往后移15像素再畫下一個字符,字的圖塊在第1頁上
char id=32? x=0???? y=0???? width=0??? height=0???? xoffset=0???? yoffset=28??? xadvance=15???? page=0 chnl=0
第一個字符編碼為漢字”象”,也就是空格,位置為0,0,寬為33,高為36, 繪制到屏幕的相應(yīng)位置時,像素偏移(0,-1),繪制完后相應(yīng)位置的x往后移36像素再畫下一個字,字的圖塊在第1頁上
char id=35937? x=0???? y=0???? width=33??? height=36???? xoffset=0???? yoffset=-1??? xadvance=36???? page=0 chnl=0
char id=26696? x=33???? y=0???? width=35???? height=36???? xoffset=-1???? yoffset=-1??? xadvance=36???? page=0 chnl=0
char id=26071? x=68???? y=0???? width=35???? height=36???? xoffset=-1??? yoffset=-1??? xadvance=36???? page=0 chnl=0
…
?
再后面是描述兩個字在進(jìn)行組合繪制時字距調(diào)整的相關(guān)信息,這里沒有要進(jìn)行間距調(diào)整的字組合所以為設(shè)-1。對于字組合間距調(diào)整可以看此示例圖:http://www.2cto.com/uploadfile/2012/0903/20120903112659845.jpg
?
kernings count=-1
這個數(shù)字代表參與字組合間距調(diào)整的字的數(shù)量。
如果kernings count大于零,后面會有類似這樣的描述:
kerning first=102? second=41 amount=2
也就是’f’與’)’進(jìn)行組合顯示’f)’時,’)’向右移2像素防止粘在一起。
?
通過上面這些信息,引擎可以通過編碼找到相應(yīng)的文字并取出對應(yīng)的紋理塊。
轉(zhuǎn)載于:https://www.cnblogs.com/iapp/archive/2012/11/15/3631753.html
總結(jié)
- 上一篇: Linux C高级编程——网络编程之以太
- 下一篇: MD5函数