2016-10-28 1 views
0

J'ai crée Bouton (s) utilisant simplement la classe Button, mais pensé que je vais essayer le ImageTextButton. Cependant, même avec seulement la classe Button, je ne suis pas tout à fait en train de suivre les docs sur la façon dont un fichier .pack (atlas) avec un fichier .json devrait fonctionner ensemble. En utilisant la classe Button, je peux «nommer» mon bouton comme je le veux dans le code, et le nommer dans le json en conséquence (voir les exemples ci-dessous), mais pour 'Image, je dois' nommer 'tout de même , de la construction en code, à travers les fichiers pack et json. Exemple de ce qui fonctionne:Libgdx manquant police LabelStyle pour ImageTextButton

Code:

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

Si vous regardez le 'scene2d.ui.Image:' définitions, tout porte le même nom. Bien que cela fonctionne de cette façon, je ne comprends pas pourquoi.

Cela pourrait être 2 questions je suppose, la préoccupation précédente sur la nomenclature de nommage entre tous ces éléments, mais mon problème actuel, je ne peux pas passer est en train d'essayer de construire un ImageTextButton. Dans le code, je les construis de manière dynamique en fonction de l'endroit où se trouve le joueur: différentes boutiques ont des objets différents à vendre, et ceux-ci sont lus dans le tableau items [].

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

Trace de la pile:

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) 

Où dois-je être la création/le réglage de la police pour ces boutons?

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

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

Répondre

1

Il n'y a aucune raison pour vos images dans votre JSON doivent avoir les mêmes noms que les dessinables en eux. Vous n'avez même pas besoin de mettre des images dans votre peau. Regardez le documentation of ImageTextButtonStyle ... ses paramètres sont Drawables, pas Images. Et c'est pourquoi il semble que vous deviez utiliser les noms de régions de texture exactes.

peau crée automatiquement un TextureRegionDrawable ou NinePatchDrawable hors d'une région de texture avec ce nom si vous ne l'avez pas créé un dans la peau. Mais vous pouvez créer toutes sortes de dessinables (tels que TiledDrawable ou TintedDrawable, ou un TextureRegionDrawable avec un rembourrage personnalisé) et de spécifier celles que l'image de votre bouton si vous voulez.

Notez également dans la documentation que ImageTextButtonStyle hérite d'un membre nommé font de TextButtonStyle, non marqué comme option dans la documentation. Vous obtenez donc une exception pour l'utilisation d'un ImageTextButtonStyle qui n'a pas spécifié de police.

Il y a deux manières que vous pouvez mettre une police dans votre peau. Si vous avez généré une police bitmap avec un outil tel que BMFont ou Heiro, vous pouvez l'empaqueter dans votre atlas de texture. Placez simplement le fichier .fnt et son image dans le même répertoire que vos autres images. Et mettez une autre copie du fichier .fnt dans votre répertoire assets, à côté de votre fichier atlas. Indiquez ensuite la police dans votre JSON de la peau en utilisant son nom de fichier:

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

Si vous utilisez FreeTypeFontGenerator, cela est plus compliqué. Dites-moi si c'est ce que vous faites.

+0

Je vois, je ne suis pas retourné assez dans la trace pour voir l'héritage TextButtonStyle de police qui n'est pas facultatif, merci de le signaler. En regardant mon ancien projet, j'ai fait des polices de caractères que vous décriviez, une avec les polices générées et les fichiers .fnt dans le dossier assets et json skin, puis un autre ensemble de polices utilisant FreeTypeFontGenerator. J'ai créé une classe 'SmartFontGenerator' pour faire ce travail. J'ai besoin de réapprendre ce que j'ai fait là-bas (ça fait presque un an que j'ai fait ce jeu). Si je vais la route de la peau, je ne devrais pas faire quelque chose de plus dans la création de mon bouton, correct? –

+0

Pouvez-vous clarifier un peu sur l'image et json? Toutes les images définies sont utilisées pour les arrière-plans, pas pour les boutons. J'ajoute les images à Table, qui sont ajoutées à une pile, et enfin à une scène. Ensuite, les boutons sont créés et placés sur le dessus. Donc, juste en créant ces objets Image, je dois le nommer tout de même. –

+0

Si vous regardez ImageButtonStyle ou ImageTextButtonStyle, notez qu'aucun des paramètres n'est Image. Ils sont Drawables. Je pense que c'est ce qui vous amène à croire que vous devez nommer vos images du même nom que leur dessinable contenu. En réalité, les images que vous définissez dans votre Json sont complètement inutilisées. (Si vous voulez vérifier cela, il suffit de supprimer la section Image de votre Json.) Lorsque le Skin charge le Json, il cherche des Drawables avec ces noms, et quand il ne trouve pas un Drawable par un certain nom, il crée automatiquement un en utilisant un TextureRegion avec ce nom. – Tenfour04