ปัญหาในการจับคู่ขนาดตัวอักษรกับความละเอียดหน้าจอใน libgdx


10

ฉันมีปัญหาในการแสดงข้อความในเกมของฉันที่มีขนาดเท่ากันบนหน้าจอที่แตกต่างกันและฉันทำการทดสอบอย่างง่าย

การทดสอบนี้ประกอบด้วยการแสดงข้อความที่เหมาะสมบนหน้าจอฉันต้องการให้ข้อความมีขนาดเท่ากันจากหน้าจอและจาก DPI

ฉันพบสิ่งนี้และคำตอบที่ฉันคิดว่าน่าจะแก้ปัญหาได้ แต่ทำไม่ได้ ในเดสก์ท็อปขนาดก็โอเค แต่ในโทรศัพท์ของฉันใหญ่เกินไป

นี่คือผลลัพธ์บน Nexus 4 ของฉัน: (ความหนาแน่น 768x1280, 2.0)

ความหนาแน่นในการคำนวณ Nexus 4

และนี่คือผลลัพธ์บน MacBook ของฉัน: (ความหนาแน่น 480x800, 0.6875)

ป้อนคำอธิบายรูปภาพที่นี่

ฉันใช้Open Sans Condensed (ลิงก์ไปยังฟอนต์ google)

อย่างที่คุณเห็นบนเดสก์ท็อปดูดี แต่บนโทรศัพท์มันใหญ่มาก

นี่คือรหัสการทดสอบของฉัน:

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

ฉันพยายามหาวิธีที่เป็นระเบียบเพื่อแก้ไขปัญหานี้ ฉันทำอะไรผิด กล้องอะไร วิวพอร์ตหรือไม่

UPDATE:

สิ่งที่ฉันต้องการคือการรักษาระยะขอบในสัดส่วนที่เป็นอิสระจากขนาดหน้าจอหรือความละเอียด ภาพนี้แสดงสิ่งที่ฉันหมายถึง

ป้อนคำอธิบายรูปภาพที่นี่


คุณต้องการให้ขนาดทางกายภาพเหมือนเดิม (ข้อความ 2 ซม. บนคอมพิวเตอร์ == 2 ซม. tekt บนมือถือ) หรือให้ข้อความพอดีกับจอแสดงผลหรือไม่
Eejin

ฉันไม่แน่ใจทั้งหมดที่คุณถามที่นี่ ลิงค์ที่คุณโพสต์นั้นดูเหมือนจะตอบคำถามนี้ คุณต้องระวังขนาดจอแสดงผลและ DPI โปรดอธิบายคำถามของคุณอย่างละเอียดเพื่อให้สามารถตอบคำถามได้อย่างถูกต้อง
Katu

ฉันจะลองดู สิ่งที่ฉันต้องการคือการรักษาสัดส่วนของข้อความระหว่างขนาดหน้าจอหรือความละเอียดที่แตกต่างกัน ฉันหมายถึงในหน้าจอภาพยนตร์จะมีขนาดใหญ่ขึ้นเป็นซม. แต่ในสัดส่วนจะมีระยะขอบเดียวกัน ดังนั้นไม่ใช่สิ่งที่ @Ejin พูดอย่างแน่นอน ฉันอัปเดตโพสต์ด้วยภาพที่แสดงสิ่งที่ฉันหมายถึง
Iñaki Bedoya

คำตอบ:


15

คุณดูเหมือนจะต้องการรักษาอัตราส่วน Textize / Screenize ที่เหมือนกัน โดยทั่วไปสิ่งที่คุณทำคือการพัฒนาที่ความละเอียดหนึ่งและให้เป็นระดับ 1.0 จากนั้นคุณแบ่งความกว้างของหน้าจอใหม่ตามความกว้างเดิมและนั่นคือปัจจัยระดับของคุณ

ตัวอย่างเช่น. พัฒนาบน 2560x1440 ด้วยขนาดตัวอักษร 16 และทำงานบน 1920x1080

ขนาดตัวอักษรจะเป็น: 1920 * 16/2560 = 12

ฉันทำเช่นเดียวกันในไลบรารีส่วนต่อประสานของฉันและทำงานได้อย่างสมบูรณ์


ขอบคุณ @Eejin เป็นสิ่งที่ฉันต้องการและทำงานได้อย่างสมบูรณ์แบบ ถ้าอย่างนั้นคำตอบที่ฉันเชื่อมโยงนั้นมีไว้สำหรับแสดงขนาดเท่ากันจริงเหรอ?
Iñaki Bedoya

นอกจากนี้ยังเกี่ยวกับการปรับขนาดด้วยอุปกรณ์ แต่ที่นี่ตัวอักษรมีขนาดใหญ่ขึ้นสำหรับความละเอียดที่มีและแบบอักษรนั้นขึ้นอยู่กับ dpi จอภาพขนาด 28 "2560x1440 มีความละเอียด dpi ที่แตกต่างจากโทรศัพท์ขนาด 5" 1920x1080 วิธีที่คุณต้องการจะเติมส่วนที่แน่นอนเสมอและวิธีการที่ DPI ทราบจะเปลี่ยนขนาดแบบอักษรเพื่อให้สามารถอ่านได้และจำไว้ว่าอาจมีพื้นที่ทำงานมากกว่า
Eejin

ขอบคุณ! มันใช้งานได้ !!
ParampalP

2
@kevinksmith นั่นอาจเป็นเพราะคุณกำลังทำการหารจำนวนเต็มไม่ใช่เพราะ 'Android บางรุ่น' ไม่ทำการคำนวณอย่างถูกต้อง
MichaelHouse

1
@ AshrafSayied-Ahmad DPI ไม่สำคัญว่าเมื่อคุณต้องมีข้อความเป็นเปอร์เซ็นต์ของความกว้างหน้าจอพิกเซล
Eejin

2

อย่าทำอะไรเลยเพียงแค่ตั้งค่าขนาดของแบบอักษรและมันจะใช้ได้กับอุปกรณ์ทุกประเภท

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

คุณสามารถเพิ่มสิ่งนี้ลงในรหัสของเขาในคำตอบของคุณเพื่อให้บริบทเกี่ยวกับสถานที่ที่ดีที่สุดในการแก้ปัญหานี้ได้หรือไม่
Tom 'Blue' Piddock

เพียงแค่ใช้บรรทัดนี้ที่คุณสร้างฟอนต์บิตแมปของคุณเหมือนในโค้ดเขาสร้างฟอนต์บิตแมปของเขาโดยการเขียนฟอนต์ = createFont (generator, 64); ดังนั้นเพียงแค่เขียน font line.setScale (.9f, .9f); ด้านล่างมัน
Sudhir singh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.