簡體   English   中英

如何在多個屏幕中處理AssetManager

[英]How to handle AssetManager in multiple screens

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

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

  • 將所有數據加載到AssetManager要么將所有資源加載到create()方法中,然后顯示初始屏幕。 (小型項目的最佳方法)

  • 否則,對於具有大量資源的大型項目,請卸載不必要的資源->加載新資源,同時向用戶加載顯示加載屏幕。

我的方法總是這樣:

創建我自己的經理類,以接收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);
    }

}

調用screen實例的dispose方法將處理所有資源,您可以在可能需要其他行為的地方覆蓋它,例如

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

屏幕調用的位置絕對取決於您。 另外,您可能希望在加載資產時顯示加載屏幕,以避免由於加載延遲而出現空白屏幕。如果您按上述方法覆蓋處置,則無法通過屏幕處置資產

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM