Problème pour faire correspondre la taille de la police à la résolution d'écran dans libgdx

10

J'ai des problèmes pour afficher du texte sur mon jeu à la même taille sur différents écrans, et j'ai fait un test simple.

Ce test consiste à montrer un texte ajusté à l'écran, je veux que le texte ait la même taille indépendamment de l'écran et du DPI.

J'ai trouvé ceci et cette réponse qui, je pense, devraient résoudre mon problème, mais ne le font pas. Dans le bureau, la taille est correcte, mais dans mon téléphone est trop grand.

Voici le résultat sur mon Nexus 4: (768x1280, densité 2.0)

Nexus 4 calcul de la densité

Et voici le résultat sur mon MacBook: (480x800, densité 0,6875)

entrez la description de l'image ici

J'utilise Open Sans Condensed (lien vers les polices google)

Comme vous pouvez le voir sur le bureau, ça a l'air bien, mais le téléphone est si gros.

Voici le code de mon test:

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

J'essaie de trouver un bon moyen de résoudre ce problème. Qu'est-ce que je fais mal? est la caméra? la fenêtre?

METTRE À JOUR:

Ce que je veux, c'est garder les mêmes marges en proportion, indépendamment de la taille ou de la résolution de l'écran. Cette image illustre ce que je veux dire.

entrez la description de l'image ici

Iñaki Bedoya
la source
Voulez-vous que la taille physique reste la même (texte de 2 cm sur ordinateur == 2 cm de tekt sur mobile) ou que le texte corresponde à l'affichage?
Eejin
Je ne sais pas exactement ce que vous demandez ici. Les liens que vous avez publiés semblent répondre à cette question. Vous devez être conscient de la taille de l'affichage et du DPI. Veuillez élaborer votre question afin de pouvoir y répondre correctement.
Katu
Je vais l'essayer. Ce que je veux, c'est garder la même proportion de texte entre différentes tailles d'écran ou résolutions. Je veux dire dans un écran de cinéma aura évidemment une plus grande taille en cm, mais en proportion aura les mêmes marges. Ce n'est donc pas exactement ce qu'a dit @Eejin. J'ai mis à jour le message avec une image qui montre ce que je veux dire.
Iñaki Bedoya

Réponses:

15

Vous semblez vouloir conserver le même rapport texte / taille d'écran. Fondamentalement, ce que vous faites est de développer à une résolution et de laisser l'échelle 1.0. Ensuite, vous divisez la nouvelle largeur d'écran par l'ancienne largeur et c'est votre facteur d'échelle.

Par exemple. Développant sur 2560x1440 avec une taille de police 16 et fonctionnant sur 1920x1080.

La taille de police sera: 1920 * 16/2560 = 12

Je fais de même dans ma bibliothèque d'interface et cela fonctionne parfaitement.

Eejin
la source
Merci @Eejin, c'est ce dont j'avais besoin et cela fonctionne parfaitement. Alors les réponses que j'ai liées sont pour montrer la même taille réelle?
Iñaki Bedoya
Il s'agit également de faire évoluer l'appareil. Mais ici, la police s'agrandit pour la résolution disponible et là, la police dépend du dpi. Un écran 28 "2560x1440 a un dpi différent d'un téléphone 5" 1920x1080. La méthode que vous souhaitez remplira toujours une certaine partie et une méthode compatible DPI changera la taille de la police afin qu'elle soit lisible et gardez à l'esprit qu'il peut y avoir plus d'espace de travail.
Eejin
THX! ça a marché!!
ParampalP
2
@kevinksmith Ce serait parce que vous effectuez une division entière, pas parce que «certaines versions d'Android» ne font pas le calcul correctement.
MichaelHouse
1
@ AshrafSayied-Ahmad Le DPI n'a pas d'importance lorsque vous avez besoin que le texte soit un certain pourcentage de pixels de largeur d'écran.
Eejin
2

Ne faites rien, définissez simplement l'échelle de la police et cela fonctionnera pour tous les types d'appareils

 font.setScale( .9f,.9f);
Sudhir singh
la source
Pourriez-vous ajouter cela à son code dans votre réponse pour donner un contexte sur le meilleur emplacement pour mettre cette solution, cela aide les futurs utilisateurs à comprendre votre réponse rapidement.
Tom 'Blue' Piddock
Utilisez simplement cette ligne où vous créez votre police bitmap comme dans son code, il a créé sa police bitmap en écrivant font = createFont (générateur, 64); Il suffit donc d'écrire la ligne font.setScale (.9f, .9f); ci-dessous
Sudhir singh