在LibGdx中管理位图字体资源

4

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

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

但我正在尝试使用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" );

如果失败了,那么调用finishLoading()方法会返回一条信息:
“无法加载资源的依赖项:“Fonts/MyFont.fnt””
好的。这很合理,因为我没有对纹理做任何处理。那么如何将纹理文件作为依赖项传递呢?github.com/libgdx/libgdx/wiki/Managing-your-assets 上说:
“BitmapFontLoader是一个很好的异步加载器的例子,它也有需要在实际资产可以加载之前加载的依赖项(在这种情况下是存储字形的纹理)。同样,您可以用这个方法做任何事情。”
唉!我想他们假设我知道该怎么做了。但是,他们的示例并没有展示如何做到这一点。事实上,他们的示例几乎跟我写的一样。所以,我被卡住了。所有谷歌能找到的都是关于TTF字体要怎么做,但是没有关于普通的位图字体的内容。
有人有解决此错误的示例吗?非常感谢!
1个回答

5
当您使用AssetManager加载BitmapFont时,它会使用BitmapFontLoader类。在Libgdx api文档中,它说道(api):

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

字形纹理会自动作为字体的依赖项进行加载。但是,为了知道要加载哪个文件作为纹理,它会在.fnt文件中检查纹理的位置。
我怀疑之所以成功加载字体而不使用AssetManager是因为您手动将字体的纹理添加为参数。
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文件,在*.png文件名前面加上了Font/,结果它奏效了。我并没有离谱;我只需要一点指导就可以了。非常感谢您。 - Mike
嗯...我注意到你在上面提取MyFont.fnt文件时引用了MyFont.png,但没有包含文件夹路径。我把我的文件夹路径加上后它也工作了。现在我想知道实际的解决方案是否只是刷新桌面项目来查找android/assets/Font文件夹的实际内容。我不确定;但是现在它仍然能够工作,而之前则不能。我很高兴。 - Mike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接