Масштабируемые шрифты в LibGDX

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

Обновление 2016-07-14: Я все-таки нашел способ работать с TTF-шрифтами.

Работать со шрифтами в LibGDX оказалось неожиданно сложно. Создать растровый шрифт проблем нет, но вот заставить его масштабироваться под разные разрешения - реальная проблема. Более или менее рабочая практика - использовать Distance field. После этого нужно еще пробросить шрифт в описание скина.

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

Я выбрал путь использования Distance field, как предлагается в документации. Используя Hiero добавляем к шрифту Distance field. Scale - 32. Spread сильно зависит от шрифта. Для Roboto Regular хороший результат получается при 1. Дальше по инструкции: Padding равным 1, X и Y равными -2.

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

class MyGame() : Game() {
    var skin : Skin = Skin()
    override fun create() {
        var robotoTexture = Texture(Gdx.files.internal("roboto.png"), true);
        robotoTexture.setFilter(
            Texture.TextureFilter.MipMapLinearNearest,
            Texture.TextureFilter.Linear
        );
        var robotoFont = BitmapFont(
            Gdx.files.internal("roboto.fnt"),
            TextureRegion(robotoTexture),
            false
        );
        skin.addRegions(TextureAtlas(Gdx.files.internal("skin.atlas")));
        skin.add("font", robotoFont);
        skin.load(Gdx.files.internal("skin.json"));
        ...
    }

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

Результат, который получается я покажу на следующей неделе (очень на это надеюсь). Мой проект подходит к стадии, когда его уже надо показывать и собирать фидбек.

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