制作皮肤时,我是否必须始终拥有.atlas文件?

时间:2015-10-06 19:57:51

标签: libgdx

我正在尝试为我的游戏构建一个简单的加载屏幕,并试图获得一个字体的皮肤。

当我尝试使用skin = game.manager.get("bin/ui/loading.json", Skin.class);来获取皮肤时,会发生以下错误:

Exception in thread "LWJGL Application" com.badlogic.gdx.utils.GdxRuntimeException: com.badlogic.gdx.utils.GdxRuntimeException: File not found: bin\ui\loadingSkin.atlas (Internal)
at com.badlogic.gdx.assets.AssetManager.handleTaskError(AssetManager.java:540)
at com.badlogic.gdx.assets.AssetManager.update(AssetManager.java:356)
at com.badlogic.gdx.assets.AssetManager.finishLoading(AssetManager.java:377)
at com.Sidescroll.game.LoadingScreen.show(LoadingScreen.java:32)
at com.badlogic.gdx.Game.setScreen(Game.java:61)
at com.Sidescroll.game.Sidescroll.create(Sidescroll.java:20)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:143)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:120)
Caused by: com.badlogic.gdx.utils.GdxRuntimeException: File not found: bin\ui\loadingSkin.atlas (Internal)
at com.badlogic.gdx.files.FileHandle.read(FileHandle.java:136)
at com.badlogic.gdx.graphics.g2d.TextureAtlas$TextureAtlasData.<init>(TextureAtlas.java:103)
at com.badlogic.gdx.assets.loaders.TextureAtlasLoader.getDependencies(TextureAtlasLoader.java:58)
at com.badlogic.gdx.assets.loaders.TextureAtlasLoader.getDependencies(TextureAtlasLoader.java:34)
at com.badlogic.gdx.assets.AssetLoadingTask.handleSyncLoader(AssetLoadingTask.java:98)
at com.badlogic.gdx.assets.AssetLoadingTask.update(AssetLoadingTask.java:87)
at com.badlogic.gdx.assets.AssetManager.updateTask(AssetManager.java:477)
at com.badlogic.gdx.assets.AssetManager.update(AssetManager.java:354)
... 6 more

在我当前的assets / ui文件夹中有5个文件:

loading_0.png - BitmapFont图像

loading.fnt - 字体文件

loading.pack - 使用TexturePacker打包单个图像

loading.png - TexturePacker图片

loadingSkin.json - Skin.json,其中描述了BitmapFont和LabelStyle

我试图使用assetmanager的部分:

//this is the beginning of the show method of my loadingScreen, nothing
//happened before

game.manager.load("bin/ui/loading.pack", TextureAtlas.class);
game.manager.finishLoading();
atlas = game.manager.get("bin/ui/loading.pack");
// do i need an atlas here ?
game.manager.load("bin/ui/loadingSkin.json", Skin.class);
game.manager.finishLoading();

skin = game.manager.get("bin/ui/loading.json", Skin.class);

问题是,我是否总是需要地图集?如果是,我如何创建一个,如果不是,为什么会发生错误?

编辑:我正在使用libgdx的1.5.4版,并且在我的项目中没有android

2 个答案:

答案 0 :(得分:1)

Skin有许多不同的结构,如:

    Skin()
    Skin(FileHandle skinFile)
    Skin(FileHandle skinFile, TextureAtlas atlas)
    Skin(TextureAtlas atlas)

如果您使用的是JSON版本的构造函数,那么您只需将json配置文件传递给它。皮肤需要有一些纹理图集,因此默认情况下,此选项会查找名为exatcly的.atlas文件,如json文件。这意味着当您使用文件名 loadingSkin.json

    game.manager.load("bin/ui/loadingSkin.json", Skin.class);

它将查找 loadingSkin.atlas 文件,因为没有这样的内容会导致错误。

现在你有两个选择:

  • 创建名为json的文件,但带有atlas扩展名( .atlas与.pack完全相同 - 你只需更改扩展名或使用.atlas创建一个文件而不是.PackPacker中的.pack

    loading.pack -> loading.atlas
    

    更改名称时要注意纹理.png文件! (.pack / .atlas文件的名称在里面 - 请与编辑一起检查)

  • 使用另一个皮肤构造函数,如:

    Skin(FileHandle skinFile, TextureAtlas atlas)
    

    您正在将文件句柄传递给.json和纹理纹理的TextureAtlas实例

    TextureAtlas atlas = game.manager.get("bin/ui/loading.pack", TextureAtlas.class);
    
    Skin skin = new Skin( Gdx.files.internal("bin/ui/loadingSkin.json"), atlas);
    

答案 1 :(得分:1)

此行会导致错误:

game.manager.load("bin/ui/loadingSkin.json", Skin.class);

当我查看 SkinLoader 类&#39;来源我已经看到它默认添加 .atlas 来加载文件:

@Override
public Skin loadSync (AssetManager manager, String fileName, FileHandle file, SkinParameter parameter) {
    String textureAtlasPath = file.pathWithoutExtension() + ".atlas";
...

所以看起来你的皮肤需要一个TextureAtlas。您可以使用https://libgdx-texturepacker-gui.googlecode.com/files/gdx-texturepacker-3.2.0.zip

创建TextureAtlas

您可以创建名为 loadingSkin.atlas 的TextureAtlas,并将其放在 bin \ ui \ loadingSkin.atlas 下。如果要创建具有其他名称的图集并告诉加载器要使用哪个TextureAtlas,可以将 SkinParameter 传递给加载方法:

SkinLoader.SkinParameter loadingSkinParameter = new SkinLoader.SkinParameter();
loadingSkinParameter.textureAtlasPath = "YOUR_TEXTURE_ATLAS_PATH";
game.manager.load("bin/ui/loadingSkin.json", Skin.class, loadingSkinParameter);