【问题标题】:Do I have to always have an .atlas file when making a skin?制作皮肤时是否必须始终拥有 .atlas 文件?
【发布时间】:2015-10-06 19:57:51
【问题描述】:

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

当我尝试使用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 - 位图字体图片

loading.fnt - 字体文件

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

loading.png - TexturePacker 图片

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

我尝试使用资产管理器的部分:

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

【问题讨论】:

    标签: libgdx


    【解决方案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 而不是 TexturePacker 中的 .pack 创建文件) p>

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

    【讨论】:

    • 你又来了 :D 谢谢你的回答,修复它:)
    【解决方案2】:

    此行导致错误:

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

    当我查看 SkinLoader 类的源代码时,我发现它默认通过附加 .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);
    

    【讨论】:

      猜你喜欢
      • 2015-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-18
      • 2014-04-18
      • 1970-01-01
      相关资源
      最近更新 更多