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.