Vấn đề khớp kích thước phông chữ với độ phân giải màn hình trong libgdx


10

Tôi gặp sự cố khi hiển thị văn bản trên trò chơi của mình ở cùng kích thước trên các màn hình khác nhau và tôi đã thực hiện một thử nghiệm đơn giản.

Thử nghiệm này bao gồm để hiển thị một văn bản phù hợp ở màn hình, tôi muốn văn bản có cùng kích thước độc lập với màn hình và từ DPI.

Tôi đã tìm thấy điều nàycâu trả lời này mà tôi nghĩ nên giải quyết vấn đề của mình nhưng không. Trong máy tính để bàn kích thước là ok, nhưng trong điện thoại của tôi là quá lớn.

Đây là kết quả trên Nexus 4 của tôi: (mật độ 768x1280, 2.0)

Mật độ tính toán Nexus 4

Và đây là kết quả trên MacBook của tôi: (mật độ 480x800, 0,6875)

nhập mô tả hình ảnh ở đây

Tôi đang sử dụng Open Sans Condensed (liên kết đến phông chữ google)

Như bạn có thể thấy trên máy tính để bàn có vẻ tốt, nhưng trên điện thoại thì quá lớn.

Đây là mã kiểm tra của tôi:

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

Tôi đang cố gắng tìm một cách gọn gàng để khắc phục điều này. Tôi đang làm gì sai? là máy ảnh? khung nhìn?

CẬP NHẬT:

Những gì tôi muốn là giữ tỷ lệ lợi nhuận tương tự, độc lập với kích thước hoặc độ phân giải màn hình. Hình ảnh này minh họa những gì tôi có ý nghĩa.

nhập mô tả hình ảnh ở đây


Bạn có muốn kích thước vật lý giữ nguyên (văn bản 2cm trên máy tính == 2cm tekt trên thiết bị di động) hoặc có văn bản phù hợp với màn hình không?
Eejin

Tôi không hoàn toàn chắc chắn những gì bạn đang hỏi ở đây. Những liên kết mà bạn đã đăng dường như trả lời câu hỏi này. Bạn phải nhận thức được kích thước hiển thị và DPI. Hãy giải thích câu hỏi của bạn, để nó có thể được trả lời chính xác.
Katu

Tôi sẽ thử nó. Điều tôi muốn là giữ cùng một tỷ lệ văn bản giữa các kích thước hoặc độ phân giải màn hình khác nhau. Ý tôi là trong một màn hình điện ảnh rõ ràng sẽ có kích thước lớn hơn tính bằng cm, nhưng theo tỷ lệ sẽ có cùng tỷ suất lợi nhuận. Vì vậy, không chính xác những gì @Eejin nói. Tôi đã cập nhật bài viết với một hình ảnh cho thấy những gì tôi muốn nói.
Iñaki Bedoya

Câu trả lời:


15

Bạn dường như muốn giữ tỷ lệ textize / sàng lọc tương tự. Về cơ bản những gì bạn làm là phát triển ở một độ phân giải và để đó là tỷ lệ 1.0. Sau đó, bạn chia chiều rộng màn hình mới cho chiều rộng cũ và đó là hệ số tỷ lệ của bạn.

Ví dụ. Phát triển trên 2560x1440 với cỡ chữ 16 và chạy trên 1920x1080.

Cỡ chữ sẽ là: 1920 * 16/2560 = 12

Tôi làm tương tự trong thư viện giao diện của tôi và nó hoạt động hoàn hảo.


Cảm ơn @Eejin, là những gì tôi cần và nó hoạt động hoàn hảo. Sau đó, các câu trả lời tôi liên kết là để hiển thị cùng kích thước thực?
Iñaki Bedoya

Nó cũng là về quy mô với thiết bị. Nhưng ở đây, phông chữ phát triển lớn hơn cho độ phân giải có sẵn và ở đó phông chữ phụ thuộc vào dpi. Một màn hình 28 "2560x1440 có dpi khác với điện thoại 5" 1920x1080. Phương thức bạn muốn sẽ luôn lấp đầy một phần nhất định và phương thức nhận biết DPI sẽ thay đổi kích thước phông chữ để chúng có thể đọc được và hãy nhớ rằng có thể có nhiều không gian làm việc hơn.
Eejin

cám ơn! nó đã làm việc!!
ParampalP

2
@kevinksmith Điều đó có thể là do bạn đang thực hiện phân chia số nguyên chứ không phải vì 'một số phiên bản của Android' không thực hiện phép tính chính xác.
MichaelHouse

1
@ AshrafSayied-Ahmad DPI không quan trọng khi bạn cần có văn bản là một tỷ lệ phần trăm pixel chiều rộng màn hình nhất định.
Eejin

2

Đừng làm bất cứ điều gì chỉ cần đặt tỷ lệ của phông chữ và nó sẽ hoạt động cho tất cả các loại thiết bị

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

Bạn có thể thêm mã này vào mã của anh ấy trong câu trả lời của bạn để đưa ra ngữ cảnh ở vị trí tốt nhất để đặt giải pháp này không, nó giúp người dùng trong tương lai hiểu câu trả lời của bạn một cách nhanh chóng.
Tom 'Blue' Piddock

Chỉ cần sử dụng dòng này nơi bạn tạo phông chữ bitmap của mình như trong mã của anh ấy, anh ấy đã tạo phông chữ bitmap của mình bằng cách viết font = createdFont (tạo, 64); Vì vậy, chỉ cần viết dòng font.setScale (.9f, .9f); bên dưới nó
Sudhir singh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.