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