Libgdx - 使用 Scene 2d 更改 Vis UI 字体不起作用,有其他选择吗?

问题描述 投票:0回答:3

我目前正在使用 Scene 2d 为我正在制作的 libgdx 应用程序创建一些用户界面。我找到了 Vis UI 并意识到它会运作得很好。除了字体,一切都很好。

由于 Vis UI 是在 Scene 2d 上制作的,我尝试使用here描述的方法来更改字体。

我尝试了简单的答案(也被标记为正确)

        Skin skin = VisUI.getSkin();
        VisUI.dispose(false);
        FreeTypeFontGenerator generator = new FreeTypeFontGenerator(Gdx.files.internal("customText.ttf"));
        FreeTypeFontGenerator.FreeTypeFontParameter parameter = new FreeTypeFontGenerator.FreeTypeFontParameter();
    parameter.size = 14;
        skin.add("default-font", generator.generateFont(parameter), BitmapFont.class);
        skin.add("small-font", generator.generateFont(parameter), BitmapFont.class);
        VisUI.load(skin);

然后我尝试了更复杂的答案

    VisUI.dispose(true);

    FreeTypeFontGenerator generator = new FreeTypeFontGenerator(Gdx.files.internal("customText.ttf"));
    FreeTypeFontGenerator.FreeTypeFontParameter parameter = new FreeTypeFontGenerator.FreeTypeFontParameter();
    parameter.size = 14;

    ObjectMap<String, Object> fontMap = new ObjectMap<String, Object>();
    fontMap.put("default-font", generator.generateFont(parameter));
    fontMap.put("small-font", generator.generateFont(parameter));

    SkinLoader.SkinParameter par = new SkinLoader.SkinParameter(fontMap);

    assets.load(VisUI.SkinScale.X1.getSkinFile().path(), Skin.class, par);
    assets.finishLoading();

    Skin skin = assets.get(VisUI.SkinScale.X1.getSkinFile().path());
    VisUI.load(skin);

这两种方法实际上都没有对

ScrollableTextArea

产生影响

前面的代码被放置在构造函数中,同时我确保在更改 VisUI 之后创建了我的

VisWindow
,因为我将窗口创建放置在 libgdx 的 Screen 界面中的
show()
方法中。

里面

VisWindow
基本上就是以下几项,仅此而已。

    textArea = new ScrollableTextArea("...");

    VisTable table = new VisTable();

    VisScrollPane scrollPane = new VisScrollPane(table);
    scrollPane.setFlickScroll(false);
    scrollPane.setFadeScrollBars(false);

    add(textArea.createCompatibleScrollPane()).growX().growY().row();

我不明白我做错了什么。我不应该使用 Scene2d 来更改字体吗?或者我是不是忘记了什么地方。

欢迎任何建议。预先感谢。

java libgdx scene2d freetype
3个回答
0
投票

您需要在加载其余小部件之前添加字体。

在加载 VisUI 之前尝试先创建皮肤。然后添加字体、图集和json文件。然后用VisUI加载生成的皮肤。

    Skin skn = new Skin();
    skn.add("default-font", font12, BitmapFont.class);

    skn.addRegions(new TextureAtlas(Gdx.files.internal(("x1/uiskin.atlas"))));
    skn.load(Gdx.files.internal("x1/uiskin.json"));
    VisUI.load(skn);

在皮肤 json 文件中删除(因为您将通过代码添加它):

com.badlogic.gdx.graphics.g2d.BitmapFont: {
default-font: {file: default.fnt }},

0
投票

回到将 Freetypefont 放入 libgdx 皮肤之后,唯一对我有用的解决方案是使用 AssetManager。例如:

AssetManager assetManager = new AssetManager();
ObjectMap<String, Object> fontMap = new ObjectMap<String, Object>();
fontMap.put("default-font", myNewFont);
SkinLoader.SkinParameter parameter = new SkinLoader.SkinParameter(fontMap);
assetManager.load("skins/basic/uiskin.json", Skin.class, parameter);
assetManager.finishLoading();
VisUI.load(assetManager.get("skins/basic/uiskin.json", Skin.class));

0
投票

如果字体已经存在于字体文件中,则该字体似乎不会被覆盖。因此,将 visui 皮肤资源复制到“assets”文件夹中(uiskin.json、uiskin.atlas、uiskin.png)。

您可以通过 IDE 中的模糊搜索找到这些内容。无论如何,您稍后可能会想要自定义它们。

然后从 uiskin.json 顶部删除字体定义(整个块)。

这是一个工作示例。您可能需要稍微调整一下密度:

    AssetManager assetManager = new AssetManager();
    ObjectMap<String, Object> fontMap = new ObjectMap<>();

    FreeTypeFontGenerator fontGenerator = new FreeTypeFontGenerator(Gdx.files.internal("Roboto-Regular.ttf"));
    FreeTypeFontGenerator.FreeTypeFontParameter fontParameter = new FreeTypeFontGenerator.FreeTypeFontParameter();

    int size = (int) (20 * Gdx.graphics.getDensity());
    fontParameter.size = size;
    fontParameter.color = new Color(1, 1, 1, 1);
    fontParameter.genMipMaps = true;
    fontParameter.magFilter = Texture.TextureFilter.Nearest;
    fontParameter.minFilter = Texture.TextureFilter.MipMap;

    fontGenerator.scaleForPixelHeight(size);
    BitmapFont font = fontGenerator.generateFont(fontParameter);

    fontMap.put("default-font", font);
    fontMap.put("small-font", font);

    SkinLoader.SkinParameter parameter = new SkinLoader.SkinParameter(fontMap);
    assetManager.load(Gdx.files.internal("uiskin.json").path(), Skin.class, parameter);
    assetManager.finishLoading();
    VisUI.load(assetManager.get(Gdx.files.internal("uiskin.json").path(), Skin.class));

我发现SO上的很多例子都不起作用,所以在这里! :)

您可能还想为默认字体和小字体生成不同的字体。为了简洁起见,我在这里对两者使用相同的。

© www.soinside.com 2019 - 2024. All rights reserved.