Android Libgdx:AssetManager未加载资产

Android Libgdx:AssetManager未加载资产,android,libgdx,assets,Android,Libgdx,Assets,好吧,我只是在与libgdx中的AssetManager进行斗争。我遵循了每一个教程,阅读了每一个维基页面,但我无法让它发挥作用 资产类别: public class Assets { private static final AssetManager manager = new AssetManager(); public static final String background = "data/lawn.png"; public static void load() { ma

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

资产类别:

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”

您的代码有太多错误

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) 您的经理是公开的,但您仍然提供其他方法来操作它(例如更新和处置)。将其设置为私有或删除方法,并直接处理
资产.manager

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

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

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


5) 您正在反复标记要加载的资产<代码>渲染()每帧调用一次。将
Assets.load()
移动到
屏幕.show()
方法,该方法只执行一次。

我知道这是前一段时间提出的(并且部分得到了回答),但我会给出我的修复方法。 在渲染方法中,放置如下内容:

if (!assetManager.update()) return;

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

资产管理器可以以同步和异步方式工作

  • 异步:在加载资产的过程中,显示一个加载进度条。这是异步的,因为更新屏幕时在后台加载资产。您可以通过反复调用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.finishLoading();
游戏会一直等到资源加载后再继续,但这确实意味着如果你加载了很多东西,游戏会冻结你的屏幕


此处的更多信息:

通常,您不需要将
资产/
作为路径的一部分。它需要相对于资产目录的路径。不要让AssetManager引用为静态,否则会导致内存泄漏和纹理损坏。我不同意这种说法。我在所有的游戏中都有一个静态资产管理器,它工作得非常好。只要正确实施生命周期方法,并在适当的时间执行
Assets.manager.dispose()
,这不会导致任何问题。另外,它非常方便!谢谢你指出那些事情。把它们整理好。但问题依然存在。还有什么可能是错误的吗?你仍然得到这个例外吗?请将代码更新到其当前状态。在create()中,您需要执行Assets.load,而不是update。我建议您阅读有关AssetManager的信息。看起来你读的所有教程都是完全错误的,因为你似乎不知道它是如何工作的。@noone同样,制作静态AssetManager通常是不好的,尤其是在Android上。
    assetManager.finishLoading();