Problema para combinar o tamanho da fonte com a resolução da tela no libgdx

10

Estou tendo problemas para mostrar texto no meu jogo no mesmo tamanho em telas diferentes e fiz um teste simples.

Este teste consiste em mostrar um ajuste de texto na tela. Quero que o texto tenha o mesmo tamanho independentemente da tela e do DPI.

Eu encontrei esta e esta resposta que acho que deveria resolver meu problema, mas não resolve. Na área de trabalho, o tamanho é bom, mas no meu telefone é muito grande.

Este é o resultado no meu Nexus 4: (768x1280, densidade 2.0)

Densidade de cálculo do Nexus 4

E este é o resultado no meu MacBook: (480x800, densidade de 0,6875)

insira a descrição da imagem aqui

Estou usando o Open Sans Condensed (link para google fonts)

Como você pode ver na área de trabalho, parece bom, mas o telefone é muito grande.

Aqui está o código do meu teste:

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();
    }
}

Estou tentando encontrar uma maneira legal de corrigir isso. O que estou fazendo de errado? é a câmera? a janela de exibição?

ATUALIZAR:

O que eu quero é manter as mesmas margens em proporção, independentemente do tamanho ou resolução da tela. Esta imagem ilustra o que quero dizer.

insira a descrição da imagem aqui

Iñaki Bedoya
fonte
Deseja que o tamanho físico permaneça o mesmo (texto de 2 cm no computador == texto de 2 cm no celular) ou que o texto caiba na tela?
Eejin
Não tenho muita certeza do que você está perguntando aqui. Os links que você postou parecem responder a esta pergunta. Você deve estar ciente do tamanho da tela e do DPI. Elabore sua pergunta, para que possa ser respondida corretamente.
Katu
Eu vou tentar. O que eu quero é manter a mesma proporção do texto entre diferentes tamanhos ou resoluções de tela. Quero dizer, em uma tela de cinema obviamente terá um tamanho maior em cm, mas proporcionalmente terá as mesmas margens. Então, não é exatamente o que o @Eejin disse. Atualizei o post com uma imagem que mostra o que quero dizer.
precisa

Respostas:

15

Você parece querer manter a mesma proporção de tamanho de texto / tamanho da tela. Basicamente, o que você faz é desenvolver em uma resolução e deixar a escala 1.0. Em seguida, você divide a nova largura da tela pela largura antiga e esse é o seu fator de escala.

Por exemplo. Desenvolvendo em 2560x1440 com tamanho de fonte 16 e rodando em 1920x1080.

O tamanho da fonte será: 1920 * 16/2560 = 12

Eu faço o mesmo na minha biblioteca de interfaces e funciona perfeitamente.

Eejin
fonte
Obrigado @Eejin, é o que eu precisava e funciona perfeitamente. Então as respostas que eu vinculei são para mostrar o mesmo tamanho real?
Iñaki Bedoya
Também se trata de dimensionar com o dispositivo. Mas aqui a fonte aumenta para a resolução disponível e a fonte depende do dpi. Um monitor de 28 "2560x1440 possui um dpi diferente de um telefone de 5" 1920x1080. O método que você deseja sempre preencherá uma determinada parte e um método com reconhecimento de DPI alterará o tamanho da fonte para que sejam legíveis e lembre-se de que pode haver mais espaço de trabalho.
Eejin
valeu! funcionou!!
ParampalP
2
@kevinksmith Isso seria porque você está fazendo a divisão inteira, não porque 'algumas versões do Android' não estão fazendo o cálculo corretamente.
MichaelHouse
1
@ AshrafSayied-Ahmad O DPI não importa quando você precisa que o texto tenha uma certa porcentagem de pixels de largura de tela.
Eejin
2

Não faça nada, apenas defina a escala da fonte e ela funcionará para todo o tipo de dispositivo

 font.setScale( .9f,.9f);
Sudhir singh
fonte
Você pode adicionar isso ao código dele na sua resposta para fornecer um contexto sobre a melhor localização para colocar esta solução, pois ajuda os futuros usuários a entenderem sua resposta rapidamente.
Tom 'Blue' Piddock
Basta usar esta linha na qual você cria sua fonte de bitmap, como no código dele, ele criou sua fonte de bitmap escrevendo font = createFont (generator, 64); Então, basta escrever a linha font.setScale (.9f, .9f); abaixo dele
Sudhir singh