Libgdx:AssetManager没有加载资产

时间:2015-04-03 01:38:01

标签: android libgdx assets

Okey我只是在libgdx中与AssetManager挣扎。我已经按照每个教程,阅读每个wikipage,但我无法让它工作。

资产类:

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

主要课程:

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

    Assets.manager.update();



}

我在Screen类中调用我的纹理:

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

因此,当我运行应用程序时,它会在显示任何内容之前崩溃: “致命的例外:GLThread 32182”“资产未加载:assets / data / lawn.png”

3 个答案:

答案 0 :(得分:5)

你的代码有这么多错误......

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()方法,该方法仅执行一次。

答案 1 :(得分:0)

我知道这是在不久前被问到的(部分回答),但是我会给出解决方案。 在渲染方法中,输入以下内容:

if (!assetManager.update()) return;

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

答案 2 :(得分:0)

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