好久沒有更新這個系列的文章了。今天下午在群上討論libgdx對中文的支援問題。本來Hiero做是最好的,但是LIbgdx的BitmapFont不支援多圖,常用漢字3500個,是在做不到一張圖上。
libgdx很早之前就有ttf的支援了,不過那個時候有點問題。經測試新版本(0.96)完全支援,特地總結出來和大家分享。
TTF字型檔
TTF(TrueTypeFont)是Apple公司和Microsoft公司共同推出的字型檔格式,隨著windows的流行,已經變成最常用的一種字型檔表示方式,應用範圍非常廣。
如果是Windows作業系統,可以從Fonts檔案夾中找到很多字型檔。也可以從網上下載。
我推薦YaHei.Consolas字型檔,看著很爽,反正我的eclipse就是用的這個字型檔。
gdx-setup-ui的使用
從libgdx下載0.96版本,可以看到檔案結構如下:
強烈運行gdx-setup-ui.jar,這一個項目初始化工具。
運行介面如下:
項目名字,包名什麼的按情況填寫。在中間的Required配置中可以直接下載最新的穩定版本和Nightly版本。不過推薦選用本地的附件。
不用解壓,直接選擇zip檔案,它會自動抽取需要的檔案。
我使用的Eclipse,直接Import即可。
我只產生了案頭項目,一般可以把Android和Web的一起產生了。
注意一下,預設的Android項目對應的SDK是15,可以根據需要更改。有時候匯入的項目會有紅色驚嘆號,添加一個assets檔案夾即可。
其中back-libgdx項目是我們的核心,一切邏輯什麼的都在這裡實現。back-libgdx-XXX是對應的啟動而已。
libgdx使用TTF字型檔
準備一個TTF字型檔改名為font.ttf複製到assets檔案夾。從壓縮包中找到gdx-stb-truetype-natives.jar和gdx-stb-truetype.jar。其中gdx-stb-truetype-natives.jar添加到案頭項目,gdx-stb-truetype.jar添加到核心項目中去。
現在來看看最關鍵的方法TrueTypeFontFactory.createBitmapFont。
我們通過它建立一個支援ttf字型檔的BitmapFont出來。它需要一個FileHandle和要支援的文字。當然還有一些參數,具體意義可以參考API文檔。
也就是說我們需要使用TTF字型檔的哪些文字必須聲明出來。不過問題也不到,3500常用漢字基本可以滿足要求。網上還有一個常用500字,不過那個完全不夠用。
我這裡隨便寫幾個作為示範。
public static final String FONT_CHARACTERS = "世界人民愛好的美好中文支援再看看";
然後使用初始化
font = TrueTypeFontFactory.createBitmapFont(Gdx.files.internal("font.ttf"), FONT_CHARACTERS, 12.5f, 7.5f,1.0f, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
剩下的工作和使用Hiero一樣的了。
public class App implements ApplicationListener {BitmapFont font;SpriteBatch batch;public static final String FONT_CHARACTERS = "世界人民愛好的美好中文支援再看看";@Overridepublic void create() {font = TrueTypeFontFactory.createBitmapFont(Gdx.files.internal("font.ttf"), FONT_CHARACTERS, 12.5f, 7.5f,1.0f, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());font.setColor(1f, 0f, 0f, 1f);batch = new SpriteBatch();}@Overridepublic void dispose() {font.dispose();}@Overridepublic void render() {Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);batch.begin();font.draw(batch, "中文支援", 10, 10);batch.end();}@Overridepublic void resize(int width, int height) {}@Overridepublic void pause() {}@Overridepublic void resume() {}}
效果如下:
在Stage中使用TTF字型檔原理是一樣,需要修改的只有BitmapFont的執行個體化方法。
寫在最後
使用TTF字型檔解決libgdx顯示中文無疑是一種很好的選擇,基本不存在顯示不出文字的情況。但是TTF字型檔的大小一般都比較大,比如我使用的字型檔是13.8M..小一點的也有3M。
對於Android應用這個大小有時候還是難以接受的。
android系統內建的字型檔位於/system/fonts/中,可以使用絕對路徑訪問...不過不推薦就是了。
使用Herio是一個高效(程式效率,不是開發效率)的方法,但是libgdx不支援Herio的多圖。
有文檔提到了使用SpriteSheetPacker,但是我一直沒有找到。google code的代碼自從遷移到Github之後就沒有了,不知道是移除了還是怎麼的了。