Libgdx 中的资产

Assets in Libgdx

这是我处理资产的方式

我有 Assets class,它有 assetsManager 并且只有文件路径字符串

public class Assets {
    public static AssetManager manager = new AssetManager();
    public static final String background = "bg.png";
    public static final String menu = "menu/menu.atlas";

    public static Texture getTexture(String name) {
        return manager.get(name, Texture.class);
    }

    public static TextureAtlas getTextureAtlas(String name) {
        return manager.get(name, TextureAtlas.class);
    }

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

在屏幕中加载资源

public class MenuScreen implements Screen {
    public void show() {
        //load assets
        Assets.manager.load(Assets.background, Texture.class);
        Assets.manager.load(Assets.menu, TextureAtlas.class);
        Assets.manager.finishLoading();
    }
}

当我使用它们时,我会这样做

Texture background = Assets.getTexture(Assets.background);

我只在游戏中调用dispose Class

public class GameMain extends Game{
    @Override
    public void dispose() {
        super.dispose();
        Assets.dispose();
    }
}

我的问题:

这是管理资产的正确方法还是我做错了什么?

另一个问题我有一个舞台(其中有使用 textureRegions 的演员)

在 PlayScreen 中处理它(及其纹理)我只调用 stage.dispose()

public class PlayScreen implements Screen{

@Override
    public void dispose() {
        stage.dispose();
    }
}

这样对不对?

通常情况下你不会做任何事情static。因此,删除每个静态关键字并将 AssetManager 放入您的主 class(扩展游戏)中。将 AssetManager 的 Getter 添加到您的主 class 并将您的主 class 的引用传递给您实例化的每个新屏幕 class。这样屏幕(在您的示例中名为 PlayScreen)可以访问主 class 和 AssetManager 来加载屏幕的资产。

此外,AssetManager 是异步的,因此如果您对其调用 finishLoading(),它将阻塞主线程,直到加载所有资产。如果您没有太多要加载,这不是问题,但如果游戏变大,通常会使用启动画面并在后台异步加载资产。有关详细信息,请参阅 this libgdx wiki link

将您的 AssetManager 放在主 class 中(就像您所做的那样)。 在 Screen 的 dispose 方法中也配置舞台和 Screen 的资产。检查 this link 以获取需要手动处理(以防止内存泄漏)的 classes 列表。

另见 示例代码。