如何在多个屏幕中处理AssetManager

时间:2017-07-19 18:11:50

标签: java android libgdx assets asset-management

应避免使用

public static AssetManager assets = new AssetManager();,但如何在多个屏幕中处理AssetManager?这是一个很好的解决方案吗?

public class myGame {

   assetMananger manager = new AssetManager(); 
   ...
   public assetManager getAssetMananger(){
      return manager; 
   }
}

public class GameScreen implements Screen{

    private AssetManager manager;

    public GameScreen(myGame game){
       manager = game.getManager();
    }

    public void render(){
        manager.load(...);
    }

2 个答案:

答案 0 :(得分:2)

Gdx.app.getApplicationListener()返回ApplicationListener个实例。您可以对您实现的类进行类型转换,然后轻松访问该类的任何方法或数据成员。

这样:

((GdxTest)Gdx.app.getApplicationListener()).assets  // <-- You can use from where you want in your project. 

ApplicationListener已实施课程:

public class GdxTest extends ApplicationAdapter {

    public Assets assets;

    @Override
    public void create() {

        assets= new Assets();
    }

    ....

    @Override
    public void dispose() {
       assets.dispose();
    }
}
处理游戏的所有资产/资源的

Assets

public class Assets implements Disposable {

    public AssetManager assetManager;

    public Assets(){

        assetManager=new AssetManager();   
    }

    ...

    @Override
    public void dispose() {
        assetManager.dispose();
    }
}
  • 加载create()方法中的所有资源,并在所有数据加载到AssetManager时显示启动画面。 (小项目的最佳方式)

  • 对于拥有大量资源的大型项目,可以卸载不必要的资源 - &gt;加载新资源,同时加载显示加载屏幕给用户。

答案 1 :(得分:0)

我的方法总是这样: -

创建我自己的经理类,如果AssetsManager接收实例并在最初加载游戏时加载所有游戏资产

public class Assets implements Disposable{
    public static final Assets instance = new Assets();
    private AssetManager manager;

    // Individual assets
    public PlayerAssets playerAssets;

    private Assets(){}

    public void init(AssetManager manager){
        this.manager = manager;
        manager.load(..);
        manager.finishLoading();
        TextureAtlas atlas = manager.get(..);
        playerAssets = new PlayerAssets(atlas);
    }
    public void dispose(){
        manager.dispose();
    }
    /** Sample Inner class for catching loaded game assets */ 
    public PlayerAssets{
        public final AtlasRegion legs;
        PlayerAssets(TextureAtlas atlas){
            legs = atlas.find(..);
        }
    }
}

在您的游戏课上加载所有游戏资产。

public class MyGame extends Game {
    @Override
    public void create(){
        Assets.instance.init(new AssetManager()); // loading your resources
        setScreen(new GameScreen());
    }
}

从下面的评论中更新

处置您的资产。您可能希望为所有屏幕创建一个抽象类,如下所示

public abstract class AbstractScreen implements Screen{
    protected Game game;
    public AbstractScreen(Game game){
        this.game = game;
    }
}

. . . . . . 

public void dispose(){
    Assets.instance.dispose();
}

然后所有的屏幕都将扩展此课程。例如

public class MenuScreen extends AbstractScreen {
    public MenuScreen(Game game){
       super(game);
    }

}

调用屏幕实例配置方法将处理所有资源, 您可以覆盖您可能更喜欢不同行为的地方 例如

@everride
public void dispose(){
    // super.dispose();
    // Release other screen resources
}

在哪里调用屏幕处理绝对取决于你。 此外,您可能希望在加载资源时显示加载屏幕,以避免因加载延迟而出现空白屏幕 如果您按上述方式覆盖dispose,则处理屏幕不会处置资产