Problema di abbinare la dimensione del carattere alla risoluzione dello schermo in libgdx


10

Ho problemi a mostrare il testo sul mio gioco della stessa dimensione su schermi diversi e ho fatto un semplice test.

Questo test consiste nel mostrare un adattamento del testo sullo schermo, voglio che il testo abbia le stesse dimensioni indipendentemente dallo schermo e dal DPI.

Ho trovato questo e questa risposta che penso dovrebbero risolvere il mio problema, ma non farlo. Sul desktop la dimensione è ok, ma nel mio telefono è troppo grande.

Questo è il risultato sul mio Nexus 4: (768x1280, densità 2.0)

Nexus 4 densità calcolatrice

E questo è il risultato sul mio MacBook: (480x800, densità 0,6875)

inserisci qui la descrizione dell'immagine

Sto usando Open Sans Condensed (link a google fonts)

Come puoi vedere sul desktop sembra buono, ma al telefono è così grande.

Ecco il codice del mio 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();
    }
}

Sto cercando di trovare un modo pulito per risolvere questo problema. Cosa sto facendo di sbagliato? è la fotocamera? il viewport?

AGGIORNARE:

Quello che voglio è mantenere gli stessi margini in proporzione, indipendentemente dalle dimensioni o dalla risoluzione dello schermo. Questa immagine illustra cosa intendo.

inserisci qui la descrizione dell'immagine


Vuoi che le dimensioni fisiche rimangano invariate (testo di 2 cm sul computer == 2 cm di testo sul cellulare) o che il testo sia adatto allo schermo?
— Eejin,

Non sono del tutto sicuro di ciò che stai chiedendo qui. Quei link che hai pubblicato sembrano rispondere a questa domanda. Devi essere consapevole delle dimensioni del display e DPI. Elabora la tua domanda, in modo che possa essere data una risposta corretta.
— Katu,

Lo proverò. Quello che voglio è mantenere la stessa proporzione del testo tra dimensioni dello schermo o risoluzioni diverse. Voglio dire, in uno schermo cinematografico avrà ovviamente dimensioni maggiori in cm, ma in proporzione avrà gli stessi margini. Quindi, non è esattamente quello che ha detto @Eejin. Ho aggiornato il post con un'immagine che mostra cosa intendo.
— Iñaki Bedoya,

Risposte:


15

Sembra che tu voglia mantenere lo stesso rapporto textize / screensize. Fondamentalmente quello che fai è sviluppare ad una risoluzione e lasciare che sia scala 1.0. Quindi dividi la nuova larghezza dello schermo per la larghezza precedente e questo è il tuo fattore di scala.

Per esempio. Sviluppato su 2560x1440 con dimensione del carattere 16 e in esecuzione su 1920x1080.

La dimensione del carattere sarà: 1920 * 16/2560 = 12

Faccio lo stesso nella mia libreria di interfacce e funziona perfettamente.


Grazie @Eejin, è quello di cui avevo bisogno e funziona perfettamente. Quindi le risposte che ho collegato sono per mostrare le stesse dimensioni reali?
— Iñaki Bedoya,

Si tratta anche di ridimensionare con il dispositivo. Ma qui il carattere diventa più grande per la risoluzione disponibile e lì il carattere dipende dal dpi. Un monitor da 25 "2560x1440 ha un dpi diverso rispetto a un telefono da 5" 1920x1080. Il metodo che desideri riempirà sempre una determinata porzione e un metodo con DPI DPI cambierà la dimensione del carattere in modo che siano leggibili e tieni presente che potrebbe esserci più spazio di lavoro.
— Eejin,

grazie! ha funzionato!!
— ParampalP

2
@kevinksmith Ciò sarebbe dovuto al fatto che stai eseguendo la divisione di interi, non perché "alcune versioni di Android" non eseguono correttamente il calcolo.
— MichaelHouse

1
@ AshrafSayied-Ahmad Il DPI non ha importanza quando è necessario che il testo sia una determinata percentuale di pixel della larghezza dello schermo.
— Eejin,

2

Non fare nulla, basta impostare la scala del carattere e funzionerà per tutti i tipi di dispositivo

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

Potresti aggiungere questo al suo codice nella tua risposta per dare contesto sulla posizione migliore per mettere questa soluzione, aiuta i futuri utenti a capire rapidamente la tua risposta.
— Tom 'Blue' Piddock,

Usa questa riga in cui crei il tuo carattere bitmap come nel suo codice ha creato il suo carattere bitmap scrivendo font = createFont (generatore, 64); Quindi basta scrivere la riga font.setScale (.9f, .9f); sotto di esso
— Sudhir singh
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.