Search code examples
jsonlibgdx

LibGdx - Error loading json file from asset manager


I am loading a skin using the assetmanager and keep getting an error because There is no Bitmapfont registered with name: font_dpb_59. I am trying to use this font in my json-file to create a Label-style. I am adding fonts and atlas in the skins parameters, am I missing something here?

I load my skin like this:

        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));

As you can see I add the fonts as parameters, but get an error. No idea what I'm doing wrong, the fonts are loaded before the skin.

Full stack trace:

    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

If this helps here is my json-file:

{
  "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" }
  }
}

EDIT:

This is how I load the fonts:

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);

Solution

  • The objects you pass into your ObjectMap here:

    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);
    

    must be BitmapFont objects, not String paths. In order to have a BitmapFont instance, you must have already finished loading one. If you are using AssetManager to load them, you must call finishLoading on the asset manager, then get(".....", BitmapFont.class) to get the BitmapFont reference to put in your object map.

    I had assumed you were doing this because you were creating BitmapFonts at runtime with FreeTypeFontGenerator, so there was no way to load them from Json. But if you already have the font files ahead of time, there's no reason you can't put them in your skin's Json file directly:

    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},
    }