LibGdx - 从资产管理器加载 json 文件时出错
Posted
技术标签:
【中文标题】LibGdx - 从资产管理器加载 json 文件时出错【英文标题】:LibGdx - Error loading json file from asset manager 【发布时间】: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。
【参考方案1】:
您在此处传递给 ObjectMap 的对象:
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);
必须是 BitmapFont 对象,而不是字符串路径。为了拥有一个 BitmapFont 实例,您必须已经完成加载一个。如果您使用 AssetManager 加载它们,则必须在资产管理器上调用 finishLoading
,然后调用 get(".....", BitmapFont.class)
以获取要放入对象映射的 BitmapFont 引用。
我假设您这样做是因为您在运行时使用 FreeTypeFontGenerator 创建 BitmapFonts,因此无法从 Json 加载它们。但是如果你已经提前有了字体文件,你没有理由不能直接把它们放在你皮肤的 Json 文件中:
com.badlogic.gdx.graphics.g2d.BitmapFont:
font_dpb_59: file: path/to/font_dpb_59.fnt,
scaledSize: 12, //integer height of capital letters
markupEnabled: false,
flip : false,
【讨论】:
哦,真的吗?我只是认为这会以某种方式干扰 AssetManager。所以我真的不需要使用assetManager加载字体吗?我可以直接将其添加到皮肤中,当我处理皮肤时,我会自动处理字体?但是我不能像上面那样使用参数设置字体的大小。 我尝试制作一个单独的方法来加载字体,并确保它在其他东西开始之前完成加载,现在它可以完美地工作了。谢谢 :D 这对我很重要,因为我需要设置字体大小 其实可以在字体上设置一些参数。请参阅上面的更新。scaledSize
是大写字母高多少整数像素,所以它与比例不完全相同。
太棒了!明天要试试这个!感谢您的所有帮助伙伴!以上是关于LibGdx - 从资产管理器加载 json 文件时出错的主要内容,如果未能解决你的问题,请参考以下文章
带有AssetManager的Libgdx FreeTypeFontGenerator