【问题标题】:How to get the natural fontsize of bitmapfont?如何获得位图字体的自然字体大小?
【发布时间】:2016-10-23 15:49:16
【问题描述】:

如果我有位图字体,例如;

fonttexture = new Texture(Gdx.files.internal("data/fonttest.png"), true);
font= new BitmapFont(Gdx.files.internal("data/fonttest.fnt"), 
                     new TextureRegion(fonttexture ), true);

是否可以检索或推断相关 png 纹理文件上使用的自然字体大小? *.fnt 文件本身在第一行指定了这一点;

info face="Calibri Light" size=32 bold=0 italic=0 charset=""

它是 32 我在代码中追求的。 我在 BitmapFonts 类上看不到直接获取它的方法,但是可以获取各种其他与高度相关的属性。

我尝试根据这些重新创建大小,但运气不佳。

float baseToAssent = font.getCapHeight()+font.getAscent();
float baseToDecent = -font.getDescent();Decent);            
float fontHeight = baseToAssent+baseToDecent;  //too small, like 11 not 32

不是字体设计师? fontophile?...嗯...平面设计师,我可能把这些碎片拼错了,或者只是缺少一个。

在任何一种情况下,计算 fonttest.png 中使用的字体大小的任何方法都会有所帮助。

谢谢

用例

我通过距离场着色器手动使用该纹理。了解纹理的自然字体大小有助于准确地将文本和行高缩放到任何请求的字体大小,而无需调整图像大小并因此降低质量。

【问题讨论】:

    标签: libgdx bitmap-fonts


    【解决方案1】:

    不确定如何获取特定的字体大小,但是您可以使用GlyphLayout 轻松获取字体的字符串宽度和高度,如下所示:

        BitmapFont font = new BitmapFont(Gdx.files.internal("data/fonttest.fnt", false);
    
        GlyphLayout glyph = new GlyphLayout(font, "TextMessage");
        float width = glyph.width;
        float height = glyph.height;
    

    如果您想了解有关 GlyphLayout 和 BitmapFont 的更多信息,请阅读此topic。 尝试了很多 32px 字体,就像你的一样。字符串“W”似乎是 29px 宽,这是我能找到的最宽的,所以如果你要归档的大小正好是它肯定是不精确的。

    您可以做一个小技巧,将 .fnt 文件作为文本文件读取并在“size=”之后查找 Integer,非常类似于 properties 文件的工作,它的效率会降低,但会返回准确的价值。

    【讨论】:

    • 确实如此。我一开始也尝试了类似的东西,结果也差不多。由于我将重用这段代码,所以我试图尽可能准确,所以我可能不得不使用 hacky 方法。
    • 是的,这似乎确实有效。不过要小心使用它,因为你可以(我也这样做)也可以调整线高。因此,该值仅在未更改时才正确。因此,我的(hackish)解决方案是维护字体及其原生大小的 hasmap。
    猜你喜欢
    • 1970-01-01
    • 2016-02-11
    • 1970-01-01
    • 2013-04-23
    • 2021-03-07
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 2011-06-19
    相关资源
    最近更新 更多