在 LibGdx 中管理位图字体资源

Mik*_*ike 4 asset-management bitmap-fonts libgdx

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

BitmapFont font= new BitmapFont( 
            Gdx.files.internal( "Fonts/MyFont.fnt" ),
            Gdx.files.internal( "Fonts/MyFont.png" ), 
            false );
Run Code Online (Sandbox Code Playgroud)

但我正在尝试实现 AssetManager。所以我用以下代码重新编码了该片段:

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" );
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

嗯嗯!我猜他们会想:“……如果你知道怎么做就好了!” 但是,他们的示例并没有显示如何实现 - 事实上,他们的示例几乎显示了我所写的内容。所以,我很困惑。所有 Google 似乎都能找到如何处理 TTF 字体的示例,但没有找到常规旧位图字体的示例。

有谁有解决此错误的示例。太感谢了!

Sam*_*l T 5

当您使用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 );
Run Code Online (Sandbox Code Playgroud)

另一方面,当您使用 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);
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

希望这能解决您的问题!


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