Libgdx缺少ImageTextButton的LabelStyle字体

时间:2016-10-28 01:07:31

标签: json button libgdx pack atlas

我一直在使用Button类创建Button,但我想尝试使用ImageTextButton。但是,即使只使用Button类,我也不会完全关注带有.json文件的.pack(atlas)文件应该如何协同工作的文档。

使用Button类,我可以命名'我的按钮,无论我喜欢什么代码,并在json中相应地命名(见下面的例子),但对于' Image,我必须' 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。在代码中,我根据玩家的位置动态构建它们:不同的商店有不同的商品可供销售,而这些商品则被读入商品[]数组。

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

atlas文件:

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
...

1 个答案:

答案 0 :(得分:1)

没有理由你的json中的图像必须与其中的drawable具有相同的名称。你甚至不需要在你的皮肤上放置图像。看看documentation of ImageTextButtonStyle ...它的参数是Drawables,而不是Images。这就是为什么你似乎需要使用精确的纹理区域名称。

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

在文档中还要注意ImageTextButtonStyle从TextButtonStyle继承了一个名为font的成员,该成员在文档中未标记为可选。因此,您使用未指定字体的ImageTextButtonStyle会出现异常。

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

指定皮肤json中的字体
com.badlogic.gdx.graphics.g2d.BitmapFont: { myfont: { file: myfont.fnt } },

如果您使用的是FreeTypeFontGenerator,则会更复杂。如果你正在做的话,请告诉我。