2017-07-19 4 views
0

public static AssetManager assets = new AssetManager(); devrait être évitée, mais comment gérer un AssetManager dans plusieurs écrans? Est-ce une bonne solution?Comment gérer AssetManager dans plusieurs écrans

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

Répondre

2

Gdx.app.getApplicationListener() renvoyer ApplicationListener instance. Vous pouvez effectuer un typage sur votre classe implémentée, puis accéder facilement à n'importe quelle méthode ou membre de données de cette classe.

De cette façon:

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

ApplicationListener classe implémentée:

public class GdxTest extends ApplicationAdapter { 

    public Assets assets; 

    @Override 
    public void create() { 

     assets= new Assets(); 
    } 

    .... 

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

classe Assets qui gèrent tous les actifs/ressources de jeu

public class Assets implements Disposable { 

    public AssetManager assetManager; 

    public Assets(){ 

     assetManager=new AssetManager(); 
    } 

    ... 

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

  • Chargez toutes les ressources dans la méthode create() et affichez l'écran de démarrage pendant que toutes vos données sont chargées sur AssetManager. (meilleur moyen pour petit projet)

  • autre pour les grands projets ayant beaucoup de ressources déchargent des ressources inutiles -> charger de nouvelles ressources, alors que l'écran de chargement d'exposition à l'utilisateur.

+1

Impressionnant! C'est tout. Je vous remercie. –

0

Mon approche est toujours comme ça: -

Créer ma propre classe gestionnaire qui reçoivent exemple, si AssetsManager et charger tous les actifs de jeu lorsque le jeu est d'abord chargé

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

Sur votre classe de jeu vous chargez tous les éléments du jeu.

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

Mise à jour du commentaire ci-dessous

vos actifs Mise au rebut. Vous pouvez créer une classe abstraite pour tout votre écran comme suit:

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

. . . . . . 

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

Ensuite, tous vos écrans étendront cette classe. par exemple

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

} 

méthode d'appel disposer par exemple d'écran disposera de toutes les ressources, vous pouvez remplacer pour les endroits où vous pouvez préférer un comportement différent par exemple

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

Où appeler Éliminez l'écran est définitivement à toi. Vous pouvez également afficher l'écran de chargement lorsque vous chargez les actifs pour éviter un écran vide en raison des retards de chargement Si vous utilisez la fonction de dépas- sement comme ci-dessus pour disposer d'un écran, ne pas disposer des actifs

+0

L'appel de la méthode 'init' à partir de' create() 'n'est pas suffisant car vous disposez de la méthode' assetManager' de l'écran 'hide()'.Si vous appelez à partir de la méthode 'show()' de l'écran, vous aurez toujours un délai avec l'écran noir en raison de 'finishLoading()' de AssetManager – Aryan

+0

J'ai mis à jour ma réponse! Qu'en est-il de cette approche? @AbhishekAryan –