Libgdx FreeTypeFontGenerator与AssetManager

7
我想使用资源管理器与FreeTypeFontGenerator结合使用。我不想加载fnt文件,因为它们在不同的屏幕分辨率下显示不同。所以我现在的做法是在每个actor或屏幕上动态生成我的字体。现在我认为最好的方法是在游戏启动时生成字体,并将它们加载到资源管理器中。但是AssetManager似乎需要一个带有BitmapFont.class参数的文件名。我想做的是生成5种不同的位图字体并将这些BitmapFonts加载到资源管理器中,这样我所有的资源都在一个地方,可以重复使用。我可以创建这些BitmapFonts,将它们保存在列表中,并将列表提供给每个actor或屏幕,就像我使用资源管理器来管理纹理和音频一样。但是将所有内容放在资源管理器中会更加优雅。那么,有没有一种方法可以将使用FreeTypeFontGenerator创建的BitmapFonts加载到资源管理器中呢?
1个回答

11

在这里,您可以阅读有关如何提供自己的 AssetLoader 的内容。

您需要实现一个SynchronousAssetLoader或者一个AsynchronousAssetLoader,它们将获取文件到一个空闲的类型字体中。通过这个工具,您可以生成所需的BitmapFont。由于您想要使用资产管理器,因此必须像这样覆盖位图字体的默认加载程序:

manager.setLoader(BitmapFont.class, new MyFreeTypeFontLoader(new InternalFileHandleResolver()));

通过AssetLoaderParameters,您可以向加载器提供更多信息,例如字体大小。

以下代码未经测试,但可能有效:

public class FreeTypeFontLoader extends SynchronousAssetLoader<BitmapFont, FreeTypeFontLoader.FreeTypeFontParameters> {

    public FreeTypeFontLoader(FileHandleResolver resolver) {
        super(resolver);
    }

    @Override
    public BitmapFont load(AssetManager assetManager, String fileName, FileHandle file, FreeTypeFontParameters parameter) {
        FreeTypeFontGenerator generator = new FreeTypeFontGenerator(file);

        return generator.generateFont(parameter.fontParameters);
    }

    static public class FreeTypeFontParameters extends AssetLoaderParameters<BitmapFont> {

        public FreeTypeFontParameter fontParameters;
    }

    @Override
    public Array<AssetDescriptor> getDependencies(String fileName, FileHandle file, FreeTypeFontParameters parameter) {
        return null;
    }

}

更新:

这已经不再必要了,gdx-freetype扩展现在自带了用于加载freetype字体的加载器!


谢谢。目前我还没有完全理解代码,但我喜欢这样做的主要原因是,我可以在我的pause()方法中使用简单的assetmanager.clear()来释放资源。现在我不确定如果我实现了这个加载器,assetmanager会释放什么。只有生成器吗?只有位图字体吗?还是两者都有? - Kedu
它将处理BitmapFonts。你可能还应该将FreeTypeFontGenerator添加到get依赖项中,这样当最后一个位图字体被处理时,它也会被处理。但是,我认为实际上不可能像这样获取BitmapFonts,因为没有办法在获取它们时指定参数。只有在加载时。最好实现一个FreeTypeFontGeneratorLoader来通过资产管理器管理生成器,但是您仍然需要自己处理所有的BitmapFonts。 - noone
也许两者都有可能的组合,但我需要自己在家里尝试一下,因为现在我在工作。 - noone
好的,谢谢。我想我只需要在每个演员和屏幕中处理字体。在资产管理器中持有FreeTypeFontGenerator并不能带给我太多好处,因为我可以在创建演员中的位图字体后立即进行处理。我的主要目标是在一个地方保存不同大小的实际位图字体,以便重用和处理。 - Kedu
请问您能否提供一下LibGDX有加载器的相关资料参考? - Oliver Dixon
@iLoveUnicorns 当然,我已经添加了代码链接。生成器加载器是我自己作为PR添加的。badlogic/mario最近刚刚添加了字体本身的那个。 - noone

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