Problem beim Anpassen der Schriftgröße an die Bildschirmauflösung in libgdx

10

Ich habe Probleme, Text in meinem Spiel in derselben Größe auf verschiedenen Bildschirmen anzuzeigen, und habe einen einfachen Test durchgeführt.

Dieser Test besteht darin, eine Textanpassung auf dem Bildschirm anzuzeigen. Ich möchte, dass der Text unabhängig vom Bildschirm und von DPI dieselbe Größe hat.

Ich habe diese und jene Antwort gefunden , von der ich denke, dass sie mein Problem lösen sollte, aber nicht. Auf dem Desktop ist die Größe in Ordnung, aber auf meinem Handy ist sie zu groß.

Dies ist das Ergebnis auf meinem Nexus 4: (768 x 1280, Dichte 2,0)

Nexus 4 berechnet Dichte

Und das ist das Ergebnis auf meinem MacBook: (480x800, 0,6875 Dichte)

Geben Sie hier die Bildbeschreibung ein

Ich verwende Open Sans Condensed (Link zu Google-Schriftarten)

Wie Sie auf dem Desktop sehen können, sieht es gut aus, aber auf dem Telefon ist es so groß.

Hier der Code meines Tests:

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

Ich versuche einen ordentlichen Weg zu finden, um dies zu beheben. Was mache ich falsch? ist die Kamera? das Ansichtsfenster?

AKTUALISIEREN:

Was ich möchte, ist, die gleichen Ränder proportional zu halten, unabhängig von der Bildschirmgröße oder Auflösung. Dieses Bild zeigt, was ich meine.

Geben Sie hier die Bildbeschreibung ein

Iñaki Bedoya
quelle
Möchten Sie, dass die physische Größe gleich bleibt (2 cm Text auf dem Computer == 2 cm Text auf dem Handy) oder muss der Text auf das Display passen?
Eejin
Ich bin mir nicht ganz sicher, was Sie hier fragen. Die von Ihnen geposteten Links scheinen diese Frage zu beantworten. Sie müssen die Anzeigegröße und die DPI kennen. Bitte erläutern Sie Ihre Frage, damit sie richtig beantwortet werden kann.
Katu
Ich werde es versuchen. Was ich möchte, ist, den gleichen Anteil des Textes zwischen verschiedenen Bildschirmgrößen oder Auflösungen beizubehalten. Ich meine, in einer Kinoleinwand wird offensichtlich eine größere Größe in cm haben, aber im Verhältnis werden die gleichen Ränder haben. Also, ist nicht genau das, was @Eejin gesagt hat. Ich habe den Beitrag mit einem Bild aktualisiert, das zeigt, was ich meine.
Iñaki Bedoya

Antworten:

15

Sie möchten anscheinend das gleiche Verhältnis von Textgröße zu Bildschirmgröße beibehalten. Grundsätzlich entwickeln Sie mit einer Auflösung und lassen dies Skalierung 1.0 sein. Dann teilen Sie die neue Bildschirmbreite durch die alte Breite und das ist Ihr Skalierungsfaktor.

Zum Beispiel. Entwickelt auf 2560x1440 mit Schriftgröße 16 und läuft auf 1920x1080.

Die Schriftgröße beträgt: 1920 * 16/2560 = 12

Ich mache das gleiche in meiner Schnittstellenbibliothek und es funktioniert perfekt.

Eejin
quelle
Danke @Eejin, das habe ich gebraucht und es funktioniert perfekt. Dann sind die Antworten, die ich verlinkt habe, für die Anzeige der gleichen tatsächlichen Größe?
Iñaki Bedoya
Es geht auch um die Skalierung mit dem Gerät. Aber hier wird die Schrift für die verfügbare Auflösung größer und dort ist die Schrift von der dpi abhängig. Ein 28 "2560x1440-Monitor hat eine andere Auflösung als ein 5" 1920x1080-Telefon. Die gewünschte Methode füllt immer einen bestimmten Bereich aus, und eine DPI-fähige Methode ändert die Schriftgröße so, dass sie lesbar ist, und berücksichtigt, dass möglicherweise mehr Arbeitsbereich vorhanden ist.
Eejin
Danke! es funktionierte!!
ParampalP
2
@kevinksmith Das liegt daran, dass Sie eine Ganzzahldivision durchführen, nicht daran, dass 'einige Versionen von Android' die Berechnung nicht korrekt durchführen.
MichaelHouse
1
@ AshrafSayied-Ahmad Die DPI spielt keine Rolle, wenn der Text einen bestimmten Prozentsatz der Pixel der Bildschirmbreite haben soll.
Eejin
2

Tun Sie nichts, stellen Sie einfach die Skalierung der Schriftart ein und es funktioniert für alle Arten von Geräten

 font.setScale( .9f,.9f);
Sudhir singh
quelle
Könnten Sie dies zu seinem Code in Ihrer Antwort hinzufügen, um den Kontext für den besten Speicherort für diese Lösung anzugeben, hilft dies zukünftigen Benutzern, Ihre Antwort schnell zu verstehen.
Tom 'Blue' Piddock
Verwenden Sie einfach diese Zeile, in der Sie Ihre Bitmap-Schriftart wie in seinem Code erstellen. Er hat seine Bitmap-Schriftart erstellt, indem er font = createFont (generator, 64) geschrieben hat. Schreiben Sie einfach die Zeile font.setScale (.9f, .9f). darunter
Sudhir singh