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 文件时出错的主要内容,如果未能解决你的问题,请参考以下文章

使用资产管理器 LibGDX 加载精灵

如何使用 libgdx 资产管理器正确加载纹理

有没有办法使用 libgdx 一次加载整个目录?

带有AssetManager的Libgdx FreeTypeFontGenerator

Libgdx之AssetManager 资源管理器及进度条的实现

Libgdx之AssetManager 资源管理器及进度条的实现