【问题标题】:libgdx: best way to load all assets in the gamelibgdx:加载游戏中所有资源的最佳方式
【发布时间】:2017-12-04 06:07:19
【问题描述】:

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

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

打开屏幕需要几秒钟。

我想快速打开它,最好的方法是什么?

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

【问题讨论】:

    标签: java libgdx


    【解决方案1】:

    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 对象传递到您需要加载资产的任何地方。将其设为 public 静态很诱人,但它可能会导致问题。

    【讨论】:

    • 这就是答案。非常感谢。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多