Проблема зіставлення розміру шрифту до роздільної здатності екрана в libgdx


10

У мене виникають проблеми показувати текст моєї гри однакового розміру на різних екранах, і я зробив простий тест.

Цей тест полягає у тому, щоб показати розміщення тексту на екрані, я хочу, щоб текст був однакового розміру незалежно від екрана та від DPI.

Я знайшов це і цю відповідь , на мою думку, повинен вирішити мою проблему, але цього не зробити. У робочому столі розмір нормальний, але в моєму телефоні занадто великий.

Це результат мого Nexus 4: (768x1280, щільність 2,0)

Обчислення щільності Nexus 4

І це результат на моєму MacBook: (480x800, щільність 0,6875)

введіть тут опис зображення

Я використовую Open Sans Condensed (посилання на шрифти google)

Як ви бачите, на робочому столі виглядає добре, але на телефоні такий великий.

Ось код мого тесту:

public class TextTest extends ApplicationAdapter
{
    private static final String TAG = TextTest.class.getName();
    private static final String TEXT = "Tap the screen to start";

    private OrthographicCamera camera;
    private Viewport viewport;

    private SpriteBatch batch;
    private BitmapFont font;

    @Override
    public void create ()
    {
        Gdx.app.log(TAG, "Screen size: "+Gdx.graphics.getWidth()+"x"+Gdx.graphics.getHeight());
        Gdx.app.log(TAG, "Density: "+Gdx.graphics.getDensity());

        camera = new OrthographicCamera();
        viewport = new ExtendViewport(Gdx.graphics.getWidth(), Gdx.graphics.getWidth(), camera);
        batch = new SpriteBatch();

        FreeTypeFontGenerator generator = new FreeTypeFontGenerator(Gdx.files.internal("fonts/OpenSans-CondLight.ttf"));
        font = createFont(generator, 64);
        generator.dispose();
    }

    private BitmapFont createFont(FreeTypeFontGenerator generator, float dp)
    {
        FreeTypeFontGenerator.FreeTypeFontParameter parameter = new FreeTypeFontGenerator.FreeTypeFontParameter();

        int fontSize = (int)(dp * Gdx.graphics.getDensity());
        parameter.size = fontSize;

        Gdx.app.log(TAG, "Font size: "+fontSize+"px");

        return generator.generateFont(parameter);
    }

    @Override
    public void render ()
    {
        Gdx.gl.glClearColor(1, 1, 1, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        int w = -(int)(font.getBounds(TEXT).width / 2);

        batch.setProjectionMatrix(camera.combined);
        batch.begin();
        font.setColor(Color.BLACK);
        font.draw(batch, TEXT, w, 0);
        batch.end();
    }

    @Override
    public void resize(int width, int height)
    {
        viewport.update(width, height);
    }

    @Override
    public void dispose()
    {
        font.dispose();
        batch.dispose();
    }
}

Я намагаюся знайти акуратний спосіб виправити це. Що я роблю неправильно? камера? вікно перегляду?

ОНОВЛЕННЯ:

Те, що я хочу, - зберігати однакові поля в пропорції, незалежно від розміру екрана чи роздільної здатності. Це зображення ілюструє те, що я маю на увазі.

введіть тут опис зображення


Ви хочете, щоб фізичний розмір залишався однаковим (2 см тексту на комп'ютері == 2 см тект на мобільному пристрої) або текст підходив до дисплея?
Eejin

Я не зовсім впевнений, що ви тут запитуєте. Ті посилання, які ви розмістили, схоже, відповідають на це запитання. Ви повинні знати про розмір дисплея та DPI. Будь ласка, розробіть своє запитання, щоб на нього можна було відповісти правильно.
Кату

Я спробую. Те, що я хочу, - це зберігати однакову пропорцію тексту між різними розмірами екрана або роздільною здатністю. Я маю на увазі, що в кінотеатрі, очевидно, буде більший розмір у см, але пропорційно матимуть однакові поля. Отже, не зовсім те, що сказав @Eejin. Я оновив публікацію зображенням, яке показує, що я маю на увазі.
Іньякі Бедоя

Відповіді:


15

Ви, здається, хочете зберегти те саме співвідношення розміру тексту / екрана. В основному те, що ви робите, розробляється за однією роздільною здатністю, і нехай це буде масштаб 1,0. Потім ви розділите нову ширину екрана на стару ширину, і це ваш коефіцієнт масштабу.

Наприклад. Розробляється на 2560x1440 з розміром шрифту 16 і працює на 1920x1080.

Розмір шрифту складе: 1920 * 16/2560 = 12

Я роблю те саме в моїй інтерфейсній бібліотеці, і вона працює чудово.


Дякую @Eejin, це те, що мені було потрібно, і це прекрасно працює. Тоді відповіді, які я пов’язував, - це те, що показують однаковий розмір?
Іньякі Бедоя

Йдеться також про масштабування за допомогою пристрою. Але тут шрифт збільшується для доступної роздільної здатності, і там шрифт залежить від dpi. Монітор розміром 25 "x 2560 x 1440" має dpi, відмінний від 5-дюймового телефону 1920х1080. Метод, який ви хочете, завжди заповнить певну частину, і метод, відомий DPI, змінить розмір шрифту, щоб він був читабельним і майте на увазі, що робочого місця може бути більше.
Eejin

Дякую! це спрацювало!!
ParampalP

2
@kevinksmith Це було б тому, що ви робите ціле ділення, а не тому, що "деякі версії Android" не роблять розрахунок правильно.
MichaelHouse

1
@ AshrafSayied-Ahmad DPI не має значення, коли вам потрібно, щоб текст був певним відсотком пікселів із шириною екрана.
Eejin

2

Дон, не робіть будь-яку річ, просто встановіть масштаб шрифту, і він буде працювати для всіх типів пристроїв

 font.setScale( .9f,.9f);

Чи можете ви додати це у свій код у своїй відповіді, щоб дати контексту найкраще місце для розміщення цього рішення, це допоможе майбутнім користувачам швидко зрозуміти вашу відповідь.
Том «Блакитний» Піддок

Просто використовуйте цей рядок, де ви створюєте свій шрифт растрової карти, як у своєму коді, він створив свій шрифт растрової карти, написавши font = createFont (generator, 64); Тому просто запишіть рядок font.setScale (.9f, .9f); під ним
Sudhir singh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.