Libgdx: AssetManager 未加载资产

Libgdx: AssetManager not loading assets

好吧,我只是在与 libgdx 中的 AssetManager 作斗争。我遵循了每个教程,阅读了每个维基页面,但我无法让它工作。

资产class:

public class Assets {

private static final AssetManager manager = new AssetManager();
public static final String background = "data/lawn.png";
public static void load() {

    manager.load(background, Texture.class);

}
public static void dispose()     {
    manager.dispose();
}

public static boolean update() {
    return manager.update();
}

主要class:

public class TombStone extends Game implements Screen {
@Override
public void create () {

    Assets.manager.update();



}

我在屏幕中这样称呼我的纹理 class:

public class StoneScreen implements Screen{
public Texture texture;
public StoneScreen(TombStone gam){
loadStandard();
}
public void loadStandard() {
texture= Assets.manager.get(Assets.background, Texture.class);
}

所以当我 运行 应用程序在显示任何给我之前崩溃了: "FATAL EXCEPTION: GLThread 32182""Asset not loaded: assets/data/lawn.png"

你的代码错误太多...

public class Assets {

public static final AssetManager manager = new AssetManager(); // 1)
public static final String background = "assets/data/lawn.png"; // 2)
public static void load() {

    manager.load(background, Texture.class);
    manager.get(background, Texture.class); // 3)
}
public static void dispose()     {
    manager.dispose();
}

public static boolean update() {
    return manager.update();
}

public class TombStone extends Game implements Screen { // 4)
@Override
public void render () {
    //assets.manager.update();
    Assets.load(); // 5)
    Assets.manager.update();
    super.render();
}

1) 你的经理是 public,但你仍然提供其他方法来操纵它(例如更新和处置)。将其设为私有或删除方法并直接在 Assets.manager.

上工作

2) 资产是相对于 assets 目录的。这就是为什么它应该是 data/lawn.png.

3) 这就是您得到异常的原因。 AssetManager.load() 只是标记要加载的内容,但不会立即加载它。这就是 AssetManager.update()(异步)或 AssetManager.finishLoading()(同步)所做的。如果您尝试在 实际 加载它之前使用 AssetManager.get(),则会出现此异常。只需删除此行。

4) 扩展Game AND 实现Screen 没有意义。一次只做其中一个。游戏有屏幕,但它本身不是屏幕。

5) 您正在将您的资产标记为一遍又一遍地加载。 render() 每帧调用一次。将Assets.load()移动到Screen.show()方法,只执行一次

我知道不久前有人问过这个问题(并部分回答了),但我会给出我的解决方案。 在您的渲染方法中,输入类似:

if (!assetManager.update()) return;

这应该会更新资产管理器(如果尚未更新)并阻止您渲染卸载的纹理。

AssetManager 可以同步和异步方式工作。

  • 异步:您显示加载进度条,在此期间您加载资产。这是异步的,因为您在更新屏幕时在后台加载资产。您可以通过一遍又一遍地调用 assetManager.update()(作为游戏循环的一部分)直到加载所有资产。这允许您更新进度条。
    这确实意味着在您确认 assetManager 已完成加载之前您不能使用纹理。 下面的示例:

    public MyAppListener implements ApplicationListener {
        public void load(){
            assetManager.load(t1, Texture.class);
             assetManager.load(t2, Texture.class);
             assetManager.load(t3, Texture.class);
        }
    
     public void render() {
         if(manager.update()) {
             // we are done loading, let's move to another screen!
        }
    
        // display loading information
         float progress = manager.getProgress()
            ... left to the reader ...
        }
    }
    
  • 您同步加载所有资产 所以你按顺序调用一次(而不是在你的游戏循环中)

    assetManager.load(t1, Texture.class);
    assetManager.load(t2, Texture.class);
    ...
    assetManager.load.load(tn, Texture.class);
    

然后你打电话

    assetManager.finishLoading();

游戏会等到资源加载完毕再继续,但这确实意味着如果您正在加载大量内容,它会冻结您的屏幕。

更多信息在这里:https://github.com/libgdx/libgdx/wiki/Managing-your-assets