2016-08-05 115 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的示例代码。