Yazı tipi boyutunu libgdx'te ekran çözünürlüğüyle eşleştirme sorunu


10

Oyunumda farklı ekranlarda aynı boyutta metin göstermek için sorun yaşıyorum ve basit bir test yaptım.

Bu test, ekrana uyan bir metin göstermeyi içerir, metnin ekrandan ve DPI'dan bağımsız olarak aynı boyutta olmasını istiyorum.

Bulduğum bu ve bu cevap benim sorunu çözmek gerektiğini düşünüyorum ama bilmediğimiz. Masaüstünde boyut tamam, ancak telefonumda çok büyük.

Bu benim Nexus 4'ümün sonucu: (768x1280, 2.0 yoğunluk)

Nexus 4 hesaplama yoğunluğu

Ve bu MacBook'umun sonucu: (480x800, 0.6875 yoğunluk)

resim açıklamasını buraya girin

Ben kullanıyorum (fontları google linki) Open Sans özet

Masaüstünde gördüğünüz gibi iyi görünüyor, ancak telefonda çok büyük.

İşte benim test kodu:

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

Bunu düzeltmek için temiz bir yol bulmaya çalışıyorum. Neyi yanlış yapıyorum? kamera görünüm?

GÜNCELLEME:

İstediğim ekran boyutundan veya çözünürlükten bağımsız olarak aynı kenar boşluklarını orantılı tutmak. Bu görüntü ne demek istediğimi göstermektedir.

resim açıklamasını buraya girin


Fiziksel boyutun aynı kalmasını mı istiyorsunuz (bilgisayarda 2 cm metin = mobilde 2 cm tekt) veya metnin ekrana sığmasını mı istiyorsunuz?
Eejin

Burada ne istediğini tam olarak bilmiyorum. Gönderdiğiniz bağlantılar bu soruyu yanıtlıyor gibi görünüyor. Ekran boyutunun ve DPI'nin farkında olmalısınız. Lütfen sorunuzu ayrıntılı bir şekilde açıklayın, böylece doğru bir şekilde cevaplanabilir.
Katu

Deneyeceğim. İstediğim, metnin aynı oranını farklı ekran boyutları veya çözünürlükler arasında tutmak. Yani bir sinema ekranında cm cinsinden daha büyük bir boyuta sahip olacağız, ancak orantılı olarak aynı kenar boşluklarına sahip olacak. Yani, @Eejin'in söylediği tam olarak bu değil. Gönderiyi ne demek istediğimi gösteren bir resim ile güncelledim.
Iñaki Bedoya

Yanıtlar:


15

Aynı metin boyutu / ekran boyutu oranını korumak istiyor gibi görünüyorsunuz. Temel olarak yaptığınız şey tek bir çözünürlükte geliştirmek ve ölçek 1.0 olsun. Sonra yeni ekran genişliğini eski genişliğe böldünüz ve bu sizin ölçek faktörünüzdür.

Örneğin. Yazı tipi boyutu 16 olan 2560x1440 üzerinde geliştirme ve 1920x1080 üzerinde çalışma.

Yazı tipi boyutu: 1920 * 16/2560 = 12

Aynı şeyi arayüz kütüphanemde de yapıyorum ve mükemmel çalışıyor.


Teşekkürler @Eejin, ihtiyacım olan şey ve mükemmel çalışıyor. O zaman bağladığım cevaplar aynı gerçek boyutu göstermek için mi?
Iñaki Bedoya

Aynı zamanda cihazla ölçeklendirme ile ilgilidir. Ancak burada yazı tipi kullanılabilir çözünürlük için büyür ve orada yazı tipi dpi'ye bağlıdır. 28 "2560x1440 monitör, 5" 1920x1080 telefondan farklı bir dpi'ye sahiptir. İstediğiniz yöntem her zaman belirli bir bölümü dolduracak ve DPI farkında bir yöntem yazı tipi boyutunu değiştirecek, böylece okunabilir olacak ve daha fazla çalışma alanı olabileceğini aklınızda tutacaktır.
Eejin

Teşekkür! işe yaradı!!
ParampalP

2
@kevinksmith Bunun nedeni, 'Android'in bazı sürümleri' hesaplamayı doğru bir şekilde yapmadığı için değil, tamsayı bölümü yapmanızdır.
MichaelHouse

1
@ AshrafSayied-Ahmad Metnin ekran genişliği piksellerinin belirli bir yüzdesi olması gerektiğinde DPI önemli değildir.
Eejin

2

Don, t herhangi bir şey yapmak sadece yazı tipi ölçeğini ayarlamak ve her tür cihaz için çalışacaktır

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

Bu çözümü koymak için en iyi konum hakkında bağlam vermek için cevabınızdaki koduna ekleyebilir misiniz, gelecekteki kullanıcıların cevabınızı hızlı bir şekilde anlamasına yardımcı olur.
Tom 'Blue' Piddock

Bitmap yazı tipinizi kendi kodunda olduğu gibi bitmap yazı tipini oluşturduğunuz font = createFont (generator, 64); Yani font.setScale (.9f, .9f) satırını yazmanız yeterlidir; altında
Sudhir singh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.