TextureAtlas和皮肤libgdx

时间:2015-12-03 21:44:06

标签: libgdx textures skin texturepacker

我愿意从Libgdx及其所有Loader中充分利用AssetManager。 但是我在解决Skin和TextureAtlas之间的这种特殊联系时遇到了问题。

我想尽可能使用JSON方式创建皮肤。

在wiki中我可以读到这个:

  

注意JSON没有描述纹理区域,九个分割或来自纹理图集的其他信息

在SkinLoader页面中,我读到了这个:

  

Skin实例的AssetLoader。 (1)所有Texture 和BitmapFont实例将作为依赖项加载。传递SkinLoader.SkinParameter允许指定与皮肤关联的纹理的(2)确切名称。否则,就像调用(3)Skin.Skin(com.badlogic.gdx.files.FileHandle)一样,查找皮肤纹理。 SkinLoader.SkinParameter还允许设置将在加载json文件之前添加到外观的命名资源,这意味着可以从json文件本身内部引用它们。这对于动态资源非常有用,例如通过FreeTypeFontGenerator生成的BitmapFont。

所以这就是我读到这篇文章时的想法。

(1)所有纹理。他们使用复数,所以我猜他们提到了我可能需要一个按钮的纹理(作为一个可绘制的),例如。

(2)纹理的确切名称。所以现在,也许他们正在谈论TextureAtlas,因为SkinParameter只有两个字段资源和textureAtlasPath。

(3)这似乎证实了(2)

所以如果我明白,如果我想用这个方法加载我的皮肤我必须使用TexturePacker和TextureAtlas。

你能否证实我已正确理解并且没有初始化纹理的方法,这种纹理将在没有TextureAtlas但使用简单的png文件的情况下在我的皮肤中使用?

如果使用TexturePacker来创建我的包文件,显然当我对其中一个纹理进行修改时,我将不得不重新打包所有内容,对吗?

1 个答案:

答案 0 :(得分:2)

皮肤确实支持为各种绘图使用单独的纹理,但它很笨重,因为它不是任何人应该做的事情。您可以做的是从Textures创建TextureRegion drawable,并在告诉皮肤加载json文件之前使用Skin按名称注册它们,如下所示:

TextureRegionDrawable someButtonImage = new TextureRegionDrawable(
    new TextureRegion(someButtonTextureThatIsAlreadyLoaded));
Skin skin = new Skin(); //don't give it a json file yet
skin.add("someButton", someButtonImage);
skin.load(Gdx.files.internal("mySkin.json"));

现在你的Json可以使用“someButton”作为皮肤中任何可绘制参数的值。

但是如果您使用的是AssetManager,只有在AssetManager之外已经加载了所有必要的纹理时才能执行此操作,因此您可以将它们作为TextureRegionDrawables的名称映射传递到SkinLoader的SkinParameter中。

无论哪种方式,你都会输入大量代码来手动加载所有这些纹理,当你可以使用纹理图集时,无论如何都会表现得更好。您可以在IDE中设置运行配置,以便在每次启动应用程序时为您打包地图集,如果您担心每次更改皮肤中的图像时都必须这样做。

上述所有内容的例外情况都是针对BitmapFonts,它不必与其他所有内容相同,因为您只能从Json加载它们。皮肤将其视为一种特殊情况。

无论如何,这是我如何加载我的皮肤以及它用于检索其drawables的图集:

assetManager.load("mySkin.json", Skin.class, new SkinLoader.SkinParameter("myAtlas.atlas"));