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

이 문제를 해결하는 깔끔한 방법을 찾으려고합니다. 내가 뭘 잘못하고 있니? 카메라입니까? 뷰포트?

최신 정보:

내가 원하는 것은 화면 크기 나 해상도에 관계없이 동일한 여백을 비례 적으로 유지하는 것입니다. 이 이미지는 내가 의미하는 바를 보여줍니다.

여기에 이미지 설명을 입력하십시오


실제 크기를 동일하게 유지 하시겠습니까 (컴퓨터에서 2cm 텍스트 == 2cm tekt) 텍스트가 디스플레이에 맞도록 하시겠습니까?
Eejin 2016 년

나는 당신이 여기서 무엇을 요구하는지 완전히 확신하지 못합니다. 귀하가 게시 한 링크는이 질문에 대한 답변으로 보입니다. 디스플레이 크기와 DPI를 알고 있어야합니다. 귀하의 질문을 정교하게 작성하여 올바르게 답변하십시오.
카투

시도해 볼게. 내가 원하는 것은 다른 화면 크기 또는 해상도 사이에 동일한 비율의 텍스트를 유지하는 것입니다. 시네마 스크린에서 분명히 크기는 cm 단위로 커지지 만 비례 적으로 동일한 마진을 갖습니다. 따라서 @Eejin이 말한 것이 아닙니다. 내가 의미하는 바를 보여주는 이미지로 게시물을 업데이트했습니다.
Iñaki Bedoya 2016 년

답변:


15

동일한 텍스트 크기 / 화면 크기 비율을 유지하려는 것 같습니다. 기본적으로 당신이하는 일은 하나의 해상도로 개발하고 1.0이되도록하십시오. 그런 다음 새 화면 너비를 이전 너비로 나누면 배율이 적용됩니다.

예를 들어. 글꼴 크기가 16 인 2560x1440에서 개발 중이며 1920x1080에서 실행 중입니다.

글꼴 크기는 1920 * 16/2560 = 12입니다.

인터페이스 라이브러리에서도 동일하게 작동하며 완벽하게 작동합니다.


감사합니다 @Eejin, 내가 필요로하고 완벽하게 작동합니다. 그렇다면 내가 연결 한 답변은 동일한 실제 크기를 나타내는 것입니까?
Iñaki Bedoya 2016 년

또한 장치를 통한 확장에 관한 것입니다. 그러나 여기에서 사용 가능한 해상도에 따라 글꼴이 커지고 dpi에 따라 글꼴이 달라집니다. 28 "2560x1440 모니터는 5"1920x1080 전화와 다른 dpi입니다. 원하는 방법은 항상 특정 부분을 채우고 DPI 인식 방법은 글꼴 크기를 변경하여 읽을 수 있고 더 많은 작업 공간이있을 수 있음을 명심하십시오.
Eejin

고마워! 그것은 일했다!!
ParampalP

2
@kevinksmith 그것은 '일부 안드로이드 버전'이 계산을 올바르게 수행하지 않기 때문에 정수 나누기를하고 있기 때문입니다.
MichaelHouse

1
@ AshrafSayied-Ahmad 텍스트가 특정 비율의 화면 너비 픽셀이어야하는 경우 DPI는 중요하지 않습니다.
Eejin

2

글꼴의 크기를 설정하면 모든 유형의 장치에서 작동합니다.

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

이 솔루션을 배치하기에 가장 적합한 위치에 컨텍스트를 제공하기 위해 답변에 코드에 추가하면 미래의 사용자가 답변을 빠르게 이해할 수 있습니다.
Tom 'Blue'Piddock

코드에서 비트 맵 글꼴을 생성 할 때이 줄을 사용하면 font = createFont (generator, 64); 따라서 font.setScale (.9f, .9f); 줄을 작성하십시오. 아래
Sudhir singh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.