【问题标题】:AssetManager seems to not be workingAssetManager 似乎无法正常工作
【发布时间】:2014-05-03 08:40:56
【问题描述】:

我正在尝试使用 AssetManager 加载我的 libgdx 游戏的关卡图像,从我遵循的指南看来这很容易,但我遇到了一个错误..

我在一个名为 Assets.java 的类中使用此代码 包加载器;

import com.badlogic.gdx.assets.AssetManager;
import com.badlogic.gdx.graphics.Texture;

public class Assets {

    public static final AssetManager manager = new AssetManager();

    public static final String level1 = "level1.png";

    public static void load() {
        manager.load(level1, Texture.class);
    }

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

主类中的这段代码:

@Override
public void create () {

    Assets.load();

    while(!Assets.manager.update()) {
        System.out.println(Assets.manager.getProgress()*100+"%");
    }

    setScreen(new GameScreen());
}

但它总是向我显示 0.0% 并且从不加载图像

我尝试加载的文件图像大小为 300 KB,我也尝试过使用小图像,但没有任何变化..

编辑

它立即进入新屏幕,但仍然无休止地打印出 0.0% 永远不会加载图像

【问题讨论】:

    标签: java android libgdx android-assets


    【解决方案1】:

    如果您想在您的创建中完成加载,请致电.finishLoading();。否则,您需要在游戏循环中调用 .update()。欲了解更多信息,请参阅this link.

    此外,我不会让经理静态!您不能保证您只有其中一个对象,因此如果您访问资产,您可能没有在 AssetManager 的该实例中加载它。每当您访问管理器时,都会创建一个新的 Assetmanager 并调用静态方法。因此,当您访问您的经理时,您总是需要加载资产,这不是您希望的正确行为。将其创建为常规对象,并在您的主对象上有一个实例,您将其传递给游戏的所有其他子系统。还要在子系统内部保存一个引用,以便您可以在需要时使用它。 => 静态版本不应该工作。

    像这样创建它:

    public class Assets {
    
        public AssetManager manager = new AssetManager();
    
        public static final String level1 = "level1.png";
    
        public void load() {
            manager.load(level1, Texture.class);
        }
    
        public void dispose() {
            manager.dispose();
        }
    }
    

    并像这样使用它:

    private Assets assets;
    @Override
    public void create () {
    
        assets.load();
        //or call the assets.finishLoading();
        while(!assets.manager.update()) {
            System.out.println(assets.manager.getProgress()*100+"%");
        }
    
        setScreen(new GameScreen(assets)); //pass it to the gamescreen ctro!
    }
    

    您还可以通过 AssetManager 扩展您的 Assets 类并直接调用 assets 对象上的 .update。 Assets extends AssetManager

    public class Assets extends AssetManager{
    
        public static final String level1 = "level1.png";
    
        public void load() {
            this.load(level1, Texture.class);
        }
        //dispose not needed since you can call Assets.dispose() since the AssetManager is disposeable.
    }
    

    【讨论】:

    • 感谢您的详细回答,我更改了代码,创建了一个对象并将其传递给屏幕,但仍然无法加载...它以 0.0% 的进度不断迭代, "继续加载文件"
    • 是的,它返回一个代表负载状态的浮点数。如果您不使用 *100,请检查它是否返回正确。或将其更改为 * 100.0f
    • 试过不做 *100 但没有任何改变,仍然是 0.0
    【解决方案2】:
    while(!Assets.manager.update()) {
        System.out.println(Assets.manager.getProgress()*100+"%");
    }
    

    根据您的代码,它只会在资产管理器未 100% 加载时打印出来。尝试删除条件,由于仅加载一个纹理,它实际上会从 0 直接打印到 1。

    【讨论】:

      猜你喜欢
      • 2017-09-04
      • 2012-05-06
      • 2013-02-17
      • 2017-10-09
      • 2017-08-03
      • 2014-05-02
      • 2011-09-11
      • 2016-02-11
      • 1970-01-01
      相关资源
      最近更新 更多