将字体大小与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();
    }
}

我正在尝试找到一种整齐的方法来解决此问题。我做错了什么?是相机吗?视口?

更新:

我想要的是与屏幕尺寸或分辨率无关地保持相同的边距。此图说明了我的意思。

在此处输入图片说明


您是希望物理尺寸保持不变(计算机上2厘米文字=移动设备上2厘米tekt)还是使文字适合显示屏?
Eejin 2014年

我不确定您在这里问什么。您发布的那些链接似乎可以回答这个问题。您必须注意显示尺寸和DPI。请详细说明您的问题,以便正确回答。
Katu 2014年

我会试试看。我想要的是在不同的屏幕尺寸或分辨率之间保持相同比例的文本。我的意思是,在电影院中,屏幕的厘米尺寸显然会更大,但比例上会有相同的边距。因此,@ Eejin所说的不完全是。我用显示我的意思的图像更新了帖子。
的Iñaki贝多亚

Answers:


15

您似乎想保持相同的textsize / screensize比率。基本上,您要做的是以一种分辨率进行开发,并将其缩放为1.0。然后,将新的屏幕宽度除以旧的宽度,这就是您的比例因子。

例如。在2560x1440上开发,字体大小为16,并在1920x1080上运行。

字体大小将是:1920 * 16/2560 = 12

我在接口库中也做同样的事情,并且效果很好。


谢谢@Eejin,这是我所需要的,并且效果很好。那么我链接的答案是为了显示相同的实际大小?
的Iñaki贝多亚

这也与设备缩放有关。但是,在这种情况下,对于可用的分辨率,字体会变大,而字体则取决于dpi。28英寸2560x1440显示器的dpi与5英寸1920x1080手机的dpi不同。所需的方法将始终填充特定部分,而DPI感知方法将更改字体大小,以便它们可读并记住可能会有更多的工作空间。
Eejin 2014年

谢谢!有效!!
ParampalP 2014年

2
@kevinksmith那是因为您正在执行整数除法,而不是因为“某些版本的Android”没有正确进行计算。
MichaelHouse

1
@ AshrafSayied-Ahmad当您需要使文本具有一定百分比的屏幕宽度像素时,DPI无关紧要。
Eejin

2

不要做任何事情,只需设置字体的大小即可,它适用于所有类型的设备

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

您能否将其添加到答案中的代码中,以提供最佳解决方案的上下文信息,它可以帮助将来的用户快速理解您的答案。
Tom'Blue'Piddock 2014年

只需在您创建位图字体的地方使用这行,就像他在他的代码中通过写font = createFont(generator,64)来创建位图字体一样即可。因此,只需编写一行font.setScale(.9f,.9f); 在它下面
Sudhir singh 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.