【发布时间】:2016-09-14 04:51:19
【问题描述】:
我正在使用资产管理器加载皮肤并不断收到错误,因为There is no Bitmapfont registered with name: font_dpb_59。我正在尝试在我的 json 文件中使用这种字体来创建标签样式。
我在皮肤参数中添加字体和图集,我在这里遗漏了什么吗?
我这样加载我的皮肤:
ObjectMap<String, Object> font_map = new ObjectMap<String, Object>();
font_map.put("font_dpb_59", font_dpb_59);
font_map.put("font_dpm_40", font_dpm_40);
//... some more fonts
manager.load(skinAtlas, TextureAtlas.class);
manager.load(menuSkin, Skin.class, new SkinLoader.SkinParameter(skinAtlas, font_map));
如您所见,我将字体添加为参数,但出现错误。不知道我做错了什么,字体是在皮肤之前加载的。
完整的堆栈跟踪:
Exception in thread "LWJGL Application" com.badlogic.gdx.utils.GdxRuntimeException: com.badlogic.gdx.utils.SerializationException: Error reading file: menu_ui/ui_skin.json
at com.badlogic.gdx.assets.AssetManager.handleTaskError(AssetManager.java:570)
at com.badlogic.gdx.assets.AssetManager.update(AssetManager.java:375)
at com.scene2d.space_camp.MyGdxGame.create(MyGdxGame.java:127)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:147)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:124)
Caused by: com.badlogic.gdx.utils.SerializationException: Error reading file: menu_ui/ui_skin.json
at com.badlogic.gdx.scenes.scene2d.ui.Skin.load(Skin.java:97)
at com.badlogic.gdx.assets.loaders.SkinLoader.loadSync(SkinLoader.java:75)
at com.badlogic.gdx.assets.loaders.SkinLoader.loadSync(SkinLoader.java:38)
at com.badlogic.gdx.assets.AssetLoadingTask.handleAsyncLoader(AssetLoadingTask.java:141)
at com.badlogic.gdx.assets.AssetLoadingTask.update(AssetLoadingTask.java:90)
at com.badlogic.gdx.assets.AssetManager.updateTask(AssetManager.java:498)
at com.badlogic.gdx.assets.AssetManager.update(AssetManager.java:373)
... 3 more
Caused by: com.badlogic.gdx.utils.SerializationException: Error reading file: menu_ui/ui_skin.json
at com.badlogic.gdx.utils.Json.fromJson(Json.java:694)
at com.badlogic.gdx.scenes.scene2d.ui.Skin.load(Skin.java:95)
... 9 more
Caused by: com.badlogic.gdx.utils.SerializationException: Serialization trace:
{}."com.badlogic.gdx.scenes.scene2d.ui.Label$LabelStyle".font_dpb_59.font
font (com.badlogic.gdx.scenes.scene2d.ui.Label$LabelStyle)
at com.badlogic.gdx.utils.Json.readFields(Json.java:804)
at com.badlogic.gdx.utils.Json.readValue(Json.java:919)
at com.badlogic.gdx.scenes.scene2d.ui.Skin$1.readValue(Skin.java:408)
at com.badlogic.gdx.utils.Json.readValue(Json.java:852)
at com.badlogic.gdx.scenes.scene2d.ui.Skin$2.readNamedObjects(Skin.java:429)
at com.badlogic.gdx.scenes.scene2d.ui.Skin$2.read(Skin.java:418)
at com.badlogic.gdx.scenes.scene2d.ui.Skin$2.read(Skin.java:414)
at com.badlogic.gdx.utils.Json.readValue(Json.java:884)
at com.badlogic.gdx.scenes.scene2d.ui.Skin$1.readValue(Skin.java:408)
at com.badlogic.gdx.utils.Json.fromJson(Json.java:692)
... 10 more
Caused by: com.badlogic.gdx.utils.GdxRuntimeException: No com.badlogic.gdx.graphics.g2d.BitmapFont registered with name: font_dpb_59
at com.badlogic.gdx.scenes.scene2d.ui.Skin.get(Skin.java:149)
at com.badlogic.gdx.scenes.scene2d.ui.Skin$1.readValue(Skin.java:407)
at com.badlogic.gdx.utils.Json.readFields(Json.java:797)
... 19 more
如果这有帮助,这里是我的 json 文件:
{
"com.badlogic.gdx.graphics.Color": {
"white": {
"r": 1, "g": 1, "b": 1, "a": 1
}
},
"com.badlogic.gdx.scenes.scene2d.ui.Label$LabelStyle": {
"font_dpb_59": {
"font": "font_dpb_59", "fontColor": "white"
}
},
"com.badlogic.gdx.scenes.scene2d.ui.TextButton$TextButtonStyle": {
"txt_btn_white": {
"up": "button1",
"down": "button1",
"font": "font_dpb_59",
"fontColor": "white",
"pressedOffsetX": 1,
"pressedOffsetY": -1 }
},
"com.badlogic.gdx.scenes.scene2d.ui.Button$ButtonStyle": {
"btn_white": {
"up": "button1" ,
"down": "button1",
"pressedOffsetX": 1,
"pressedOffsetY": -1 }
},
"com.badlogic.gdx.scenes.scene2d.ui.ScrollPane$ScrollPaneStyle": {
"default": { }
},
"com.badlogic.gdx.scenes.scene2d.ui.Window$WindowStyle": {
"default": { "titleFont": "font_dpb_59", "titleFontColor": "white" }
}
}
编辑:
这是我加载字体的方式:
FileHandleResolver resolver = new InternalFileHandleResolver();
manager.setLoader(FreeTypeFontGenerator.class, new FreeTypeFontGeneratorLoader(resolver));
manager.setLoader(BitmapFont.class, ".ttf", new FreetypeFontLoader(resolver));
FreetypeFontLoader.FreeTypeFontLoaderParameter params59 = new FreetypeFontLoader.FreeTypeFontLoaderParameter();
params59.fontFileName = font_dpb_59;
params59.fontParameters.size = 59;
manager.load(font_dpb_59, BitmapFont.class, params59);
【问题讨论】:
-
不确定可能是什么问题。您的字体可能不是 BitmapFont 对象吗?如果它是 BitmapFont 的子类,则不会在皮肤中注册为 BitmapFont。
-
@Tenfour04 添加了代码以显示我如何加载位图字体对象。难道是因为所有这些都是同时加载的(即我从不调用finishLoading),所以字体没有在皮肤之前加载?这会有点奇怪,因为我确实在皮肤“之前”加载了字体
-
如果您还没有完成加载 BitmapFont,您如何获得它的引用?我会说,是的,这就是问题所在。实际上,
font_dpb_59是您的 fontFileName 参数看起来很可疑,因为这是您放入 ObjectMap 中的资源的名称。也许您将字符串传递给 SkinParameter 而不是 BitmapFonts。