Проблема в соответствии размера шрифта с разрешением экрана в 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. Разрешение 28 "2560x1440 точек на дюйм отличается от 5" 1920x1080 телефона. Требуемый метод всегда будет заполнять определенную часть, а метод с поддержкой DPI будет изменять размер шрифта, чтобы они были читабельными, и имейте в виду, что может быть больше рабочего пространства.
— Eejin

Спасибо! это сработало!!
— ParampalP

2
@kevinksmith Это потому, что вы делаете целочисленное деление, а не потому, что «некоторые версии Android» не выполняют вычисления правильно.
— MichaelHouse

1
@ AshrafSayied-Ahmad DPI не имеет значения, когда вам нужно, чтобы текст составлял определенный процент пикселей в ширину экрана.
— Эджин

2

Не делайте ничего, просто установите масштаб шрифта, и он будет работать для всех типов устройств.

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

Не могли бы вы добавить это к его коду в своем ответе, чтобы определить контекст наилучшего места для размещения этого решения, это поможет будущим пользователям быстро понять ваш ответ.
— Том Блю Пиддок

Просто используйте эту строку, где вы создаете свой растровый шрифт, как в своем коде он создал свой растровый шрифт, написав font = createFont (generator, 64); Так что просто напишите строку font.setScale (.9f, .9f); ниже
— Судхир Сингх
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.