libgdx:加载游戏中所有资产的最佳方式

时间:2015-11-11 13:15:38

标签: java libgdx

在我的播放屏幕中有很多纹理Texture,字体FreeType,图片scene2d.Image和按钮scene2d.Button。所以,当我设置播放屏幕时

((Game) Gdx.app.getApplicationListener()).setScreen(new PlayScreen());

打开屏幕需要几秒钟。

我想快速打开它,实现这一目标的最佳途径是什么?

我是否创建了一个新类来创建所有资源,然后将它们加载到屏幕上?

1 个答案:

答案 0 :(得分:18)

You should use the AssetManager。经理允许您在开始游戏时加载资产。它还具有向您显示已加载资产的百分比的功能,以便您可以显示进度条。有很多资源可以告诉你如何使用AssetManager。有些人会向您展示静态AssetManager的示例,但不鼓励使用badlogic,这会导致黑色图像。

您应该创建一个类,用于存储您希望与管理器一起处理的资产,并且管理器将异步加载它。我喜欢使用AssetDescriptor并使用静态描述符来查找我的纹理。但是有许多不同的方法可以使用AssetManager。您可以像管理员manager.load("images/sometexture.png, Texture.class);一样向管理员添加一些内容,然后按照manager.get("images/sometexture.png");进行查找,这样就可以通过它的路径简单地查找纹理。

public class Assets {
public AssetManager manager = new AssetManager();

    public static final AssetDescriptor<Texture> someTexture = 
        new AssetDescriptor<Texture>("images/sometexture.png", Texture.class);

public static final AssetDescriptor<TextureAtlas> uiAtlas =
        new AssetDescriptor<TextureAtlas>("ui/uiskin.pack", TextureAtlas.class);

public static final AssetDescriptor<Skin> uiSkin =
        new AssetDescriptor<Skin>("ui/uiskin.json", Skin.class,
                new SkinLoader.SkinParameter("ui/uiskin.pack"));

public void load()
{
    manager.load(someTexture);
    manager.load(uiAtlas);
    manager.load(uiSkin);
}

public void dispose()
{
    manager.dispose();
}
}

在切入点我创建一个带徽标的启动画面,然后我开始加载我的资产。以下是加载资产的方法。

public class MyGame extends Game
{
  public void create()
  {
    Assets assets = new Assets();
    assets.manager.load(); //starts loading assets

    //option 1
    assets.manager.finishLoading(); //Continues when done loading.
    //it won't continue until all assets are finished loading.
  }

  //option 2
public void update()
  {
    //draw something nice to look at
    if (manager.update())
    {
      //Assets have finished loading, change screen maybe?
      setScreen(new MenuScreen(assets)); //your screen should take a Assets object in it's constructor.
    }
  }  
}

也许您可以像平常一样加载菜单资源,让资产管理器在用户进入菜单时工作。那取决于你。这是您加载资产的方式。

someTexture = assets.manager.get(Assets.someTexture);
atlas = assets.manager.get(Assets.uiAtlas);
skin = assets.manager.get(Assets.uiSkin);

同样的规则适用于查找地图册中的区域,最好是在地图册中的每个区域执行此操作一次。您必须将Assets对象传递到需要加载资源的任何位置。它使得它公开静态很诱人,但它可能会导致问题。