2016-08-05 72 views
0

這是我的方式來處理資產資產在Libgdx

我有有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); 

我打電話處置在遊戲類唯一

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

我的問題:

這是管理資產還是我做錯什麼正確的方法是什麼?

另一個問題我有一個階段(其中具有使用textureRegions演員)

在播放屏幕處置它(以及它的紋理)我叫stage.dispose()只

public class PlayScreen implements Screen{ 

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

這是正確的或不 ?

+0

怎麼了所有'靜態'?你不喜歡OOP?不要這樣做。刪除每個出現的'static'關鍵字。 – Xoppa

回答

0

通常的方式,你不會使所有的東西static。因此,刪除每個靜態關鍵字並將AssetManager放入主類(它擴展了Game)。爲AssetManager添加一個Getter到您的主類,並將您的主類的引用傳遞給您實例化的每個新的Screen類。因此,屏幕(在您的示例名爲PlayScreen)可以訪問主類,它是AssetManager加載屏幕的資產。

另外,AssetManager意味着是異步的,所以如果你調用finishLoading()就會阻塞主線程,直到所有的資源都被加載。如果你沒有太多的負載,這不是問題,但是如果遊戲變得更大,通常會使用啓動畫面,並且資源在後臺異步加載。有關更多信息,請參見this libgdx wiki link

將您的AssetManager配置到主類中(就像您一樣)。 在屏幕的dispose方法中也放置舞臺和屏幕資源。請檢查this link以獲取需要手動處理的類的列表(以防止內存泄漏)。

另外參見this question的示例代碼。