我一直在使用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
...
答案 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,则会更复杂。如果你正在做的话,请告诉我。