【问题标题】:Managing Bitmap Font assets in LibGdx在 LibGdx 中管理位图字体资源
【发布时间】:2019-01-22 18:35:50
【问题描述】:

我可以使用以下代码很好地加载位图字体:

BitmapFont font= new BitmapFont( 
            Gdx.files.internal( "Fonts/MyFont.fnt" ),
            Gdx.files.internal( "Fonts/MyFont.png" ), 
            false );

但我正在尝试实现 AssetManager。所以我用以下代码重新编码了 sn-p:

AssetManager assetManager = new AssetManager();
assetManager.load( "Fonts/MyFont.fnt", BitmapFont.class );
assetManager.load( "Fonts/MyFont.png", Texture.class );
assetManager.finishLoading();
BitmapFont font = assetManager.get( "Fonts/MyFont.fnt" );

当然如果失败了。对 finishLoading() 方法的调用返回了一条消息,指示:

无法加载资产的依赖项:“Fonts/MyFont.fnt”

好的。这是有道理的,因为我没有对纹理做任何事情。那么如何将纹理文件作为依赖项传递呢? github.com/libgdx/libgdx/wiki/Managing-your-assets 说:

BitmapFontLoader 是一个很好的异步加载器示例,它也 在实际资产可以加载之前需要加载依赖项 加载(在这种情况下,它是存储字形的纹理)。再一次,你 几乎可以用它做任何事情。

嗯嗯!我猜他们假设,“......如果你知道怎么做!”但是,他们的示例并没有说明如何 - 事实上,他们的示例几乎显示了我所写的内容。所以,我很难过。 Google 似乎能找到的只是 TTF 字体的示例,但对于常规的旧位图字体却一无所获。

有没有人有解决这个错误的例子。谢谢一百万!

【问题讨论】:

    标签: libgdx asset-management bitmap-fonts


    【解决方案1】:

    当您使用AssetManager 加载BitmapFont 时使用BitmapFontLoader 类。在 Libgdx api 文档中说 (api)

    用于 BitmapFont 实例的 AssetLoader。异步加载字体描述文件 (.fnt),加载包含字形的纹理作为依赖项。

    字形纹理作为字体的依赖项自动加载。但是,要知道要加载哪个文件作为纹理,它会在 .fnt 文件中检查纹理的位置。

    我怀疑没有使用 AssetManager 加载字体成功的原因是因为你手动添加了字体的 Texture 作为参数。

    BitmapFont font= new BitmapFont( 
            Gdx.files.internal( "Fonts/MyFont.fnt" ),
            Gdx.files.internal( "Fonts/MyFont.png" ), // This lets it know what texture to use
            false );
    

    另一方面,当您使用 AssetManager 时,它无法找到/加载纹理依赖项。要解决此问题,请打开 .fnt 文件并确保 file="something.png" 指向您的字体纹理字形。 (它必须与 png 的名称相同。在您的情况下为file="MyFont.png"

    希望能解决你的问题。

    我久经考验的代码:

        AssetManager manager = new AssetManager();
        manager.load("fonts/MyFont.fnt", BitmapFont.class);
        manager.finishLoading();
    
        font = manager.get("fonts/MyFont.fnt", BitmapFont.class);
    

    MyFont.fnt 文件的摘录:

    info face=font size=54 bold=0 italic=0 charset= unicode= stretchH=100 smooth=1
    aa=1 padding=2,2,2,2 spacing=0,0 outline=0 common lineHeight=50 base=43 scaleW=243
    scaleH=511 pages=1 packed=0
    page id=0 file="MyFont.png"  <-- The important part
    

    希望这能解决您的问题!


    另外请注意,当我测试 AssetManager 时,我注意到它仅在 .fnt 为基本文本时才加载。当我尝试使用使用标签(如 html)的 .fnt 文件时,纹理无法加载。我使用littera 生成了用于测试的位图字体。

    【讨论】:

    • 是的,我注意到 *.fnt 文件是一个简单的文本文件,其中 *.png 文件引用。但后来我想到了——字体文件在 assets 文件夹下的 Font 文件夹中;也许*.fnt 文件需要告诉assetManager *.png 文件也在Font 文件夹中。所以我手动编辑了 *.fnt 文件,将 Font/ 放在 *.png 文件名的前面,然后 BOOM BABY - 它起作用了。毕竟我离得不远。我所需要的只是朝着正确的方向轻推。非常感谢。
    • 嗯...我注意到您在上面的 MyFont.fnt 文件的摘录中的 MyFont.png 引用没有该文件夹。我把它从我的身上取下来了,它也起作用了。现在我想知道实际的解决方案是否只是刷新桌面项目以查找 android/assets/Font 文件夹的实际内容。我不知道;但它现在仍然有效,而以前没有。我很高兴。
    猜你喜欢
    • 1970-01-01
    • 2015-07-06
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    相关资源
    最近更新 更多