Masalah untuk mencocokkan ukuran font dengan resolusi layar di libgdx

10

Saya mengalami masalah untuk menampilkan teks pada game saya pada ukuran yang sama di layar yang berbeda, dan saya melakukan tes sederhana.

Tes ini terdiri untuk menunjukkan pemasangan teks di layar, saya ingin teks memiliki ukuran yang sama secara independen dari layar dan dari DPI.

Saya telah menemukan ini dan jawaban ini yang menurut saya harus menyelesaikan masalah saya tetapi tidak. Di desktop ukurannya ok, tapi di ponsel saya terlalu besar.

Ini adalah hasil pada Nexus 4 saya: (kepadatan 768x1280, 2.0)

Nexus 4 menghitung kepadatan

Dan ini adalah hasil di MacBook saya: (480x800, kepadatan 0,6875)

masukkan deskripsi gambar di sini

Saya menggunakan Open Sans Condensed (tautan ke font google)

Seperti yang Anda lihat di desktop terlihat bagus, tetapi di ponsel begitu besar.

Berikut kode tes saya:

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

Saya mencoba menemukan cara yang rapi untuk memperbaikinya. Apa yang saya lakukan salah? apakah kameranya? viewport?

MEMPERBARUI:

Yang saya inginkan adalah menjaga margin yang sama secara proporsional, terlepas dari ukuran atau resolusi layar. Gambar ini menggambarkan apa yang saya maksud.

masukkan deskripsi gambar di sini

Iñaki Bedoya
sumber
Apakah Anda ingin ukuran fisik tetap sama (teks 2cm di komputer == 2cm tekt di ponsel) atau ada teks yang pas dengan tampilan?
Eejin
Saya tidak sepenuhnya yakin apa yang Anda tanyakan di sini. Tautan yang Anda poskan tampaknya menjawab pertanyaan ini. Anda harus mengetahui ukuran layar dan DPI. Tolong uraikan pertanyaan Anda, sehingga dapat dijawab dengan benar.
Katu
Saya akan mencobanya. Yang saya inginkan adalah menjaga proporsi teks yang sama di antara ukuran atau resolusi layar yang berbeda. Maksud saya di layar bioskop jelas akan memiliki ukuran lebih besar dalam cm, tetapi secara proporsional akan memiliki margin yang sama. Jadi, tidak persis apa yang dikatakan @Eejin. Saya memperbarui posting dengan gambar yang menunjukkan apa yang saya maksud.
Iñaki Bedoya

Jawaban:

15

Anda tampaknya ingin mempertahankan rasio ukuran teks / screensize yang sama. Pada dasarnya apa yang Anda lakukan adalah mengembangkan pada satu resolusi dan biarkan itu menjadi skala 1.0. Kemudian Anda membagi lebar layar baru dengan lebar lama dan itu adalah faktor skala Anda.

Sebagai contoh. Berkembang pada 2560x1440 dengan ukuran font 16 dan berjalan pada 1920x1080.

Ukuran font adalah: 1920 * 16/2560 = 12

Saya melakukan hal yang sama di perpustakaan antarmuka saya dan berfungsi dengan baik.

Eejin
sumber
Terima kasih @Eejin, adalah apa yang saya butuhkan dan berfungsi dengan baik. Lalu jawaban yang saya tautkan untuk menunjukkan ukuran sebenarnya yang sama?
Iñaki Bedoya
Ini juga tentang penskalaan dengan perangkat. Tetapi di sini font tumbuh lebih besar untuk resolusi yang tersedia dan di sana font tergantung pada dpi. Monitor 28 "2560x1440 memiliki dpi berbeda dari telepon 1920x1080 5". Metode yang Anda inginkan akan selalu mengisi bagian tertentu dan metode DPI sadar akan mengubah ukuran font sehingga dapat dibaca dan perlu diingat bahwa mungkin ada lebih banyak ruang kerja.
Eejin
Terima kasih! itu berhasil !!
ParampalP
2
@kevinksmith Itu karena Anda melakukan pembagian integer, bukan karena 'beberapa versi Android' tidak melakukan perhitungan dengan benar.
MichaelHouse
1
@ AshrafSayied-Ahmad DPI tidak masalah ketika Anda harus memiliki teks menjadi persentase tertentu dari lebar piksel layar.
Eejin
2

Jangan lakukan apa-apa, hanya mengatur skala font dan itu akan berfungsi untuk semua jenis perangkat

 font.setScale( .9f,.9f);
Sudhir singh
sumber
Bisakah Anda menambahkan ini ke kodenya dalam jawaban Anda untuk memberikan konteks pada lokasi terbaik untuk menempatkan solusi ini, ini membantu pengguna di masa depan memahami jawaban Anda dengan cepat.
Tom 'Blue' Piddock
Cukup gunakan baris ini di mana Anda membuat font bitmap Anda seperti dalam kodenya, ia membuat font bitmapnya dengan menulis font = createFont (generator, 64); Jadi cukup tulis baris font.setScale (.9f, .9f); di bawahnya
Sudhir singh