android遊戲開發框架libgdx的使用(三)–中文顯示與漢字繪制 – Android移動開發技術文章_手機開發 Android移動開發教學課程

本來這篇想寫場景的,但是昨天和群裡一個朋友討論瞭一下libgdx顯示漢字的問題。以前沒有註意到這個問題,發現還是蠻嚴重的,要是不支持中文,libgdx用著就有點不愉快瞭。

我們來看看BitmapFont類,這是有關文字繪制的。看一下源碼:


public BitmapFont () {  

        this(Gdx.files.classpath("com/badlogic/gdx/utils/arial-15.fnt"),  

            Gdx.files.classpath("com/badlogic/gdx/utils/arial-15.png"), false, true);  

}

 

 

這是默認的構造函數,可以看出它加載瞭兩個文件arial-15.fnt和arial-15.png。

arial-15.fnt文件的部分內容:

		info face="Arial" size=15 bold=0 italic=0 charset="" unicode=0 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1
common lineHeight=18 base=14 scaleW=256 scaleH=256 pages=1 packed=0
page id=0 file="arial-15.png"
chars count=189
char id=32   x=0     y=0     width=0     height=0     xoffset=0     yoffset=14    xadvance=4     page=0  chnl=0 
char id=255   x=0     y=0     width=8     height=19     xoffset=-1     yoffset=0    xadvance=7     page=0  chnl=0 
char id=254   x=8     y=0     width=9     height=19     xoffset=1     yoffset=0    xadvance=8     page=0  chnl=0 
char id=253   x=17     y=0     width=8     height=19     xoffset=-1     yoffset=0    xadvance=7     page=0  chnl=0 
char id=252   x=25     y=0     width=9     height=19     xoffset=1     yoffset=0    xadvance=8     page=0  chnl=0 
char id=251   x=34     y=0     width=9     height=19     xoffset=1     yoffset=0    xadvance=8     page=0  chnl=0 
char id=250   x=43     y=0     width=9     height=19     xoffset=1     yoffset=0    xadvance=8     page=0  chnl=0 
char id=249   x=52     y=0     width=9     height=19     xoffset=1     yoffset=0    xadvance=8     page=0  chnl=0 
char id=248   x=61     y=0     width=9     height=19     xoffset=1     yoffset=0    xadvance=8     page=0  chnl=0 
char id=247   x=70     y=0     width=9     height=19     xoffset=1     yoffset=0    xadvance=8     page=0  chnl=0 
char id=246   x=79     y=0     width=9     height=19     xoffset=1     yoffset=0    xadvance=8     page=0  chnl=0 
char id=245   x=88     y=0     width=9     height=19     xoffset=1     yoffset=0    xadvance=8     page=0  chnl=0 
char id=244   x=97     y=0     width=9     height=19     xoffset=1     yoffset=0    xadvance=8     page=0  chnl=0 
char id=243   x=106     y=0     width=9     height=19     xoffset=1     yoffset=0    xadvance=8     page=0  chnl=0 
char id=242   x=115     y=0     width=9     height=19     xoffset=1     yoffset=0    xadvance=8     page=0  chnl=0 
char id=241   x=124     y=0     width=9     height=19     xoffset=1     yoffset=0    xadvance=8     page=0  chnl=0 
char id=240   x=133     y=0     width=9     height=19     xoffset=1     yoffset=0    xadvance=8     page=0  chnl=0 
char id=239   x=142     y=0     width=5     height=19     xoffset=0     yoffset=0    xadvance=3     page=0  chnl=0 
…

kernings count=374
kerning first=49  second=49  amount=-1
kerning first=121  second=44  amount=-1
kerning first=121  second=46  amount=-1
kerning first=119  second=44  amount=-1
kerning first=119  second=46  amount=-1
kerning first=118  second=44  amount=-1
kerning first=118  second=46  amount=-1
kerning first=114  second=44  amount=-1
kerning first=114  second=46  amount=-1
kerning first=89  second=44  amount=-2
kerning first=89  second=45  amount=-1
kerning first=89  second=46  amount=-2
kerning first=89  second=58  amount=-1
kerning first=89  second=59  amount=-1
kerning first=89  second=65  amount=-1
kerning first=89  second=97  amount=-1
kerning first=89  second=101  amount=-1

…

 

再看看arial-15.png:

arial-15

可以很明顯看出,libgdx的文字繪制是根據fnt文件獲取對應文字的在png中的坐標位置,然後截取圖片的相應部分進行繪制。

那麼要讓libgdx支持中文思路就很簡單瞭,我們自己構造fnt和png文件,其中包含我們要使用的中文即可。

作者給我們提供瞭一個對應的工具:Hiero。

下載後雙擊運行,在右側列表中選擇一個可以用的字體,然後輸入需要的中文,最好保留自動生成的英文和符號。

hiero界面

在右側的Effects中可以設置效果:

hiero界面效果

點File—Save as BMFont Files,生成兩個文件,將它們拷貝到asserts文件夾。

生成的文件

使用


bitmapFont = new BitmapFont(Gdx.files.internal("cf.fnt"), Gdx.files.internal("cf.png"), false);

指定我們生成的文件作為繪制的參考,然後繪制:


bitmapFont.draw(spriteBatch, "FPS" + Gdx.graphics.getFramesPerSecond(), 5, Gdx.graphics.getHeight() – 10);  

bitmapFont.draw(spriteBatch, "祝大傢光棍節快樂", 0, Gdx.graphics.getHeight()/2-8);

 

 

效果:

libgdx顯示漢字效果圖

關於多行文字:

可以調用


public TextBounds drawMultiLine (SpriteBatch spriteBatch, CharSequence str, float x, float y)

或者


public TextBounds drawMultiLine (SpriteBatch spriteBatch, CharSequence str, float x, float y, float alignmentWidth,HAlignment alignment)


作者:黃雲坤
出處:http://www.cnblogs.com/htynkn/

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *