TrueType шрифты в LibGDX

Опубликовано 14 July 2016 в Java

LibGDX прекрасная библиотека. Ее очень легко использовать, хотя в ней есть некоторые аспекты, которые не так просты и понятны. Шрифты - один из примеров. Я провел много часов прежде чем нашел решение, при котором шрифты и на десктопе и в мобильных телефонах выглядят пристойно. Я уже писал, что у меня получилось добиться результатов с Distance field, но я ошибался. Заставить хорошо выглядеть удалось только TTF.

Забудьте о bitmap-шрифтах. На попытки заставить их выглядеть пристойно на всех девайсах уйдет уйма времени. Результат при этом будет более чем посредственным. Даже не смотря на то, что это более или менее рекомендованный путь. Но все-таки, если у вас не сотни шрифтов, лучше использовать TrueType Fonts.

TTF дают великолепный результат. Но есть в их использовании один маленький трюк: нужно размер шрифта сделать независимым от размера экрана. Вот сниппет, который готовит, конвертирует и добавляет в скин TTF-шрифт.

class MyGame() : Game() {

    var skin : Skin = Skin()

    override fun create() {
        val generator = FreeTypeFontGenerator(Gdx.files.internal("Roboto-Regular.ttf"))

        val param = FreeTypeFontGenerator.FreeTypeFontParameter()

        val ratio = Gdx.graphics.width / 960f

        param.size = (48 * ratio).toInt()
        val robotoFont = generator.generateFont(param)

        skin.addRegions(TextureAtlas(Gdx.files.internal("skin.atlas")))
        skin.add("normaltext", robotoFont)

        skin.load(Gdx.files.internal("skin.json"))
    }

    override fun dispose() {
        super.dispose()
        skin.dispose()
    }
}

Все очень просто. Работает идеально. Никаких просадок производительности не замечено.

---
Возник вопрос? Мне всегда можно написать в Twitter: avkorablev