Проблема в соответствии размера шрифта с разрешением экрана в 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
источник
Спасибо @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); ниже
Судхир Сингх