Libgdx ImageTextButton 缺少 LabelStyle 字体

Libgdx Missing LabelStyle font for ImageTextButton

我一直在使用 Button class 创建 Button,但我想我会尝试使用 ImageTextButton。但是,即使只有 Button class,我也不太了解 .pack(atlas)文件与 .json 文件应该如何协同工作的文档。

使用按钮 class,我可以 'name' 我的按钮,无论我在代码中喜欢什么,并在 json 中相应地命名它(参见下面的示例),但是对于 '图片,我必须 'name' 一切都一样,从代码构造,到包和 json 文件。有效示例:

代码:

// note the 'Constants' just point to the json and atlas files, respectively.
skinShops = new Skin(Gdx.files.internal(Constants.SKIN_SHOPS), new
TextureAtlas(Constants.TEXTURE_ATLAS_SHOPS));
// for this next line, note the json definition for Button$ButtonStyle:
Button buttonBuy = new Button(skinShops, "Button-Buy");
// for Images, it seems I cannot have a 'unique' name first, then the drawable name, which I thought refers to the json
Image imgItemsBackground = new Image(skinShops, "shop-items-background");

如果您查看 'scene2d.ui.Image:' 定义,一切都被命名为相同的。虽然它以这种方式工作,但我不清楚为什么。

我猜这可能是 2 个问题,之前关注的是所有这些元素之间的命名命名法,但我无法解决的当前问题是尝试构建 ImageTextButton。在代码中,我根据玩家所在的位置动态构建它们:不同的商店有不同的商品出售,这些商品被读入 items[] 数组。

ImageTextButton buttonPurchase = new ImageTextButton(items[j], skinShops, "shop_item-button-background");

堆栈跟踪:

Exception in thread "LWJGL Application" java.lang.IllegalArgumentException: Missing LabelStyle font.
at com.badlogic.gdx.scenes.scene2d.ui.Label.setStyle(Label.java:78)
at com.badlogic.gdx.scenes.scene2d.ui.Label.<init>(Label.java:72)
at com.badlogic.gdx.scenes.scene2d.ui.ImageTextButton.<init>(ImageTextButton.java:57)
at com.badlogic.gdx.scenes.scene2d.ui.ImageTextButton.<init>(ImageTextButton.java:44)
at com.uv.screen.InteriorScreen.buildItemButtons(InteriorScreen.java:134)

我应该在哪里为这些按钮创建/设置字体?

json 文件:

{
com.badlogic.gdx.scenes.scene2d.ui.Button$ButtonStyle: {
Button-Exit: { down: Button_Exit_112x60, up: Button_Exit_112x60 },
Button-Buy: { down: Button_Buy_112x60, up: Button_Buy_112x60 },
Button-Sell: { down: Button_Sell_112x60, up: Button_Sell_112x60 }
},
com.badlogic.gdx.scenes.scene2d.ui.ImageTextButton$ImageTextButtonStyle: {
  shop_item-button-background: { down: shop_item-button-background, up: shop_item-button-background }
},
com..badlogic.gdx.scenes.scene2d.ui.Image: {
  background: { drawable: background },
  shop-items-background: { drawable: shop-items-background },
  shop-menu-background: { drawable: shop-menu-background },
  shop-talk-text-background: { drawable: shop-talk-text-background },
  weapon-shop-portrait_world1: { drawable: weapon-shop-portrait_world1 },
  armor-shop-portrait_world1: { drawable: armor-shop-portrait_world1 },
  item-shop-portrait_world1: { drawable: item-shop-portrait_world1 },
  inn-shop-portrait_world1: { drawable: inn-shop-portrait_world1 }
}

图集文件:

shops-pack.png
format: RGBA8888
filter: Nearest,Nearest
repeat: none
background
  rotate: false
  xy: 0, 504
  size: 800, 480
  orig: 800, 480
  offset: 0, 0
  index: -1
shop-items-background
  rotate: false
  xy: 0, 248
  size: 608, 256
  orig: 608, 256
  offset: 0, 0
  index: -1
shop_item-button-background
  rotate: false
  xy: 0, 60
  size: 256, 60
  orig: 256, 60
  offset: 0, 0
  index: -1
...

json 中的图像没有理由必须与其中的可绘制对象同名。您甚至不需要将图像放入您的皮肤中。看看documentation of ImageTextButtonStyle...它的参数是Drawables,不是Images。这就是为什么您似乎需要使用确切的纹理区域名称。

如果您尚未在皮肤中创建纹理区域,皮肤会自动从具有该名称的纹理区域创建一个 TextureRegionDrawable 或 NinePatchDrawable。但是您可以创建各种 Drawable(例如 TiledDrawable 或 TintedDrawable,或带有自定义填充的 TextureRegionDrawable),如果您愿意,可以将它们指定为按钮的图像。

另请注意,在文档中,ImageTextButtonStyle 从 TextButtonStyle 继承了一个名为 font 的成员,该成员在文档中未标记为可选。因此,您在使用未指定字体的 ImageTextButtonStyle 时遇到异常。

有几种方法可以将字体放入皮肤中。如果您使用 BMFont 或 Heiro 等工具生成了位图字体,则可以将其打包到您的纹理图集中。只需将 .fnt 文件及其图像与您正在打包的其他图像放在同一目录中即可。并将 .fnt 文件的另一个副本放入您的 assets 目录中,在您的 atlas 文件旁边。然后使用文件名指定皮肤中的字体 json:

com.badlogic.gdx.graphics.g2d.BitmapFont: { myfont: { file: myfont.fnt } },

如果您使用的是 FreeTypeFontGenerator,这会更复杂。让我知道你是否正在这样做。