LIBGDX: FreeTypeFontGenerator and BitmapTrueFont
在剛開始敲I;P游戲的時候, 字體使用的是BitmapFont, 只要有一套字體的PNG文件就可以顯示字體數據了. 并且通過BitmapFont對象可以很好的跟Label結合在一起使用. BitmapFont中的字體從PNG文件中截取出來有很多方便的地方, 比如, 一來只需要準備使用的字符即可, 這樣字體文件比較小; 二來可以定義任意的圖案來代替字符, 靈活性定制方便. 但反過來, 由于基于PNG文件, 也導致了BitmapFont有個兩個主要的缺陷 --
1. 標量字體, 放大會失真;
2. 字符集有限, 尤其是使用中文時, 改動幾率大;
好在LIBGDX還在其擴展庫(gdx-freetype)中提供了另外一個好用的對象 --- FreeTypeFontGenerator. 通過這個對象可以加載TTF (TrueType Font), 然后產生BitmapFont對象就可以使用了.
下面是FreeTypeFontGenerator對象的主要函數原型.
/** Generates a new {@link BitmapFont}, containing glyphs for the given characters. The size is expressed in pixels. Throws a * GdxRuntimeException in case the font could not be generated. Using big sizes might cause such an exception. All characters * need to fit onto a single texture. * @param size the size in pixels * @param characters the characters the font should contain * @param flip whether to flip the font horizontally, see {@link BitmapFont#BitmapFont(FileHandle, TextureRegion, boolean)} */ public BitmapFont generateFont (int size, String characters, boolean flip) {}/** Generates a new {@link BitmapFont}. The size is expressed in pixels. Throws a GdxRuntimeException in case the font could not * be generated. Using big sizes might cause such an exception. All characters need to fit onto a single texture. * * @param size the size of the font in pixels */ public BitmapFont generateFont (int size) {}
在LIBGDX中, AssetManager是個很實用的對象, 通過它可以在游戲初始時就將資源加載或者初始化好, 使用時只需要傳遞資源名稱即可獲取相關資源. 比如, 下面代碼加載了TextureAtlas和Sound的資源.
assetManager.load(PackConfig.SCREEN_PLAY, TextureAtlas.class); assetManager.load(PackConfig.SCREEN_MENU, TextureAtlas.class); assetManager.load(AudioConfig.MENU_CLICK, Sound.class); assetManager.load(AudioConfig.TRAY_CATCH, Sound.class);
字體也是一種資源, 因此也可以通過AssetManager來加載TTF字體. 為了能使得兩者無縫鏈接, 可以模仿BitmapFont對象創建個BitmapTrueFont來實現.
package jie.android.ip.common.ttf; import java.util.HashMap; import com.badlogic.gdx.assets.AssetLoaderParameters; import com.badlogic.gdx.graphics.g2d.BitmapFont; import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator; import com.badlogic.gdx.utils.Disposable; public class BitmapTrueFont implements Disposable { private final HashMap<Integer, BitmapFont> fontMap = new HashMap<Integer, BitmapFont>(); private final FreeTypeFontGenerator generator; private final String chars; public BitmapTrueFont(final FreeTypeFontGenerator generator, final BitmapTrueFontParameter parameter) { this.generator = generator; this.chars = parameter.getChars(); } @Override public void dispose() { for (final BitmapFont font : fontMap.values()) { if (font != null) { font.dispose(); } } if (generator != null) { generator.dispose(); } } public final BitmapFont getBitmapFont(int size) { if (generator == null) { return null; } BitmapFont font = fontMap.get(Integer.valueOf(size)); if (font == null) { if (chars == null) { font = generator.generateFont(size); } else { font = generator.generateFont(size, chars, false); } fontMap.put(Integer.valueOf(size), font); } return font; } static public class BitmapTrueFontParameter extends AssetLoaderParameters<BitmapTrueFont> { private String chars = null; public BitmapTrueFontParameter() { } public BitmapTrueFontParameter(final String chars) { this.chars = chars; } public final String getChars() { return chars; } } }
OK, 現在可以使用下面代碼加載TTF資源了.
assetManager.load("example.ttf", BitmapTrueFont.class, new BitmapTrueFont.BitmapTrueFontParameter(null));
posted on 2014-03-09 21:03 codejie 閱讀(1985) 評論(6) 編輯 收藏 引用 所屬分類: G7 、I;P