我目前正在使用 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 来更改字体吗?或者我是不是忘记了什么地方。
欢迎任何建议。预先感谢。
您需要在加载其余小部件之前添加字体。
在加载 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 }},
回到将 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));
如果字体已经存在于字体文件中,则该字体似乎不会被覆盖。因此,将 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上的很多例子都不起作用,所以在这里! :)
您可能还想为默认字体和小字体生成不同的字体。为了简洁起见,我在这里对两者使用相同的。