【问题标题】:LibGdx image loads on Desktop but not AndroidLibGdx 图像在桌面上加载,但在 Android 上不加载
【发布时间】:2024-01-17 16:13:01
【问题描述】:

当我尝试在 android 上加载一些图像时,我因错误而崩溃

FATAL EXCEPTION: GLThread 50638
Process: com.greenpipestudios.seedpeople, PID: 28277
com.badlogic.gdx.utils.GdxRuntimeException: Couldn't load file: gui/up.png
at com.badlogic.gdx.graphics.Pixmap.<init>(Pixmap.java:140)
at com.badlogic.gdx.graphics.TextureData$Factory.loadFromFile(TextureData.java:98)
at com.badlogic.gdx.graphics.Texture.<init>(Texture.java:100)
at com.badlogic.gdx.graphics.Texture.<init>(Texture.java:92)
at com.greenpipestudios.seedpeople.ResourceManager.loadGuiImages(ResourceManager.java:188)

我正在通过我的ResourceManager.java 模块加载所有图像。通过此方法加载的所有精灵图像都可以正常工作:

public void loadImages(int sprite_id){

    try{
        if(images.get(sprite_id) != null)return;
    }catch(NullPointerException e){
        return;
    }

    int imwidth = dimensions.get(sprite_id)[0];
    int imheight = dimensions.get(sprite_id)[1];;   
    int[] numFrames = frameCounts.get(sprite_id);
    int numSprites = numFrames.length;
    ArrayList<TextureRegion[]> sprites = new ArrayList<TextureRegion[]>();


    try {
        Texture spritesheet = new Texture(Gdx.files.internal(imgpaths.get(sprite_id)));
        TextureRegion[][] sheet = TextureRegion.split(spritesheet,imwidth,imheight);

        for(int i = 0; i < numSprites; i++){
            TextureRegion[] sprite = new TextureRegion[frameCounts.get(sprite_id)[i]];
            for(int j = 0; j < frameCounts.get(sprite_id)[i]; j++){
                sheet[i][j].flip(false, true);
                sprite[j] = sheet[i][j];
            }
            sprites.add(sprite);
        }




        images.set(sprite_id, sprites);
    } catch (Exception e) {

        e.printStackTrace();
    }
}

Texture spritesheet = new Texture(Gdx.files.internal(imgpaths.get(sprite_id))); 行在 Android 和桌面上都可以正常加载。 imgpaths.get(sprite_id) 返回一个字符串,例如 "sprites/player.png"

以下方法在android上的指定行崩溃,但在桌面上可以正常工作:

btnUp = new TextureRegion(new Texture(Gdx.files.local("gui/up.png")));

public void loadGuiImages(){
    btnUp = new TextureRegion(new Texture(Gdx.files.local("gui/up.png")));
    btnAction = new TextureRegion(new Texture(Gdx.files.local("gui/action.png")));
    btnPause = new TextureRegion(new Texture(Gdx.files.local("gui/pause.png")));
}

如您所见,Texture 构造函数 Texture(FileHandle f) 使用类似的参数被调用,但在一个实例中崩溃,而不是在另一个实例中崩溃。

注意:我测试了自己加载纹理(不在 TextureRegion 构造函数内部),但仍然遇到相同的错误。此外,图像是二维的,但它们甚至不应该是。

【问题讨论】:

  • 注意:我已确认它们已打包到 .apk 中,因此这不是 Eclipse 资产同步错误。

标签: java android opengl libgdx


【解决方案1】:

您说 Gdx.files.internal 方法适用于桌面和 android,但 Gdx.files.local 不适用于 android。您的代码中有任何部分可以在 android 上调用 Gdx.files.local 吗?

我认为 internal 是资产应该驻留的地方,而 local 则适用于较小的文件(例如:游戏状态)。

不同的操作系统对内部/本地位置的处理方式略有不同。这可能就是为什么事情在桌面上而不是在安卓上“工作”的原因。您交换 Gdx.files 调用可能会将您指向不同的地方。

【讨论】:

  • 我觉得自己非常愚蠢,因为我花了一段时间在这个游戏上工作(36 小时不睡觉)并且没有注意到我自己的错字。我打算使用内部但搞砸了。很抱歉浪费了一个帖子。
  • 我确定您不是第一个(或将是最后一个)在马拉松比赛中编写代码并键入非编译器检测到的错误的人。希望你把它理顺了。
  • 现在一切看起来都不错,但老实说这个问题可能应该被删除。
最近更新 更多