2016-08-05 22 views
0

Das ist meine Art und Weise mit einem Vermögen umgehenAssets in Libgdx

Ich habe Assets Klasse, die assetsManager und nur Strings von Dateien Pfad

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

In Bildschirm hat ich laden Assets

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

Wenn ich sie verwende, mache ich das

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

ich in Spielklasse verfügen rufen

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

Meine Frage:

Ist das eine richtige Art und Weise Vermögenswerte zu verwalten, oder bin ich etwas falsch?

Eine andere Frage, die ich eine Bühne haben (die Akteure, die textureRegions verwenden)

In Gabebildschirm zu entsorgen (mit Texturen) Ich nenne stage.dispose() nur

public class PlayScreen implements Screen{ 

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

Ist das richtige oder nicht ?

+0

Was ist los mit all den statischen? Du magst OOP nicht? Tu das nicht. Entfernen Sie jedes Vorkommen des statischen Schlüsselworts. – Xoppa

Antwort

0

Die übliche Weise, die Sie nicht alles static machen. Entfernen Sie also jedes statische Schlüsselwort und fügen Sie den AssetManager in Ihre Hauptklasse ein (wodurch das Spiel erweitert wird). Fügen Sie Ihrer Hauptklasse einen Getter für den AssetManager hinzu und übergeben Sie jeder neuen Screen-Klasse, die Sie instanziieren, eine Referenz Ihrer Hauptklasse. Damit der Bildschirm (in Ihrem Beispiel PlayScreen genannt) auf die Hauptklasse und AssetManager zugreifen kann, um die Assets des Bildschirms zu laden.

Auch der AssetManager ist asynchron. Wenn Sie also finishLoading() aufrufen, blockiert er den Hauptthread, bis alle Assets geladen sind. Dies ist kein Problem, wenn Sie nicht viel zu laden haben, aber wenn ein Spiel größer wird, wird normalerweise ein Begrüßungsbildschirm verwendet und Assets werden asynchron im Hintergrund geladen. Weitere Informationen finden Sie unter this libgdx wiki link.

Entsorgen Sie Ihren AssetManager in der Hauptklasse (wie Sie es getan haben). Entsorgen Sie die Bühne UND die Bildschirm-Assets auch in der dispose Methode des Bildschirms. Überprüfen Sie this link für eine Liste von Klassen, die manuell entsorgt werden müssen (um Speicherverluste zu vermeiden).

Siehe auch this question zum Beispiel Code.