2017-08-08 57 views
1

我想将所有资产加载到Async任务中。 我对此没有清楚的想法,也无法从网上找到任何相关示例。使用Async任务加载所有资产 - Libgdx

它看起来像使用AssetManager是一次加载资产的最佳方式。 但我有一些资产,如龙骨动画,这是不可能由AssetManager加载。

我已经创建了一个接口,这样的:

public interface IAsyncCallBack { 

    public abstract void WorkToDo();  
    public abstract void onFinish(); 

} 

在MyGdxClass的创建我定义方法体方法:

final AsyncCallBack callback = new AsyncCallBack() { 

     @Override 
     public void WorkToDo() { 
      // TODO Auto-generated method stub 
      loadAssets(); 
     } 

     @Override 
     public void onFinish() { 
     isLoaded = true; 
      // TODO Auto-generated method stub 

     } 

    }; 

但我对与LibGdx和装载资产创造的AsyncTask不知道用它。 任何帮助,将不胜感激。

在此先感谢。

+0

我仍然建议使用AssetManager,你可以使用编写自己的资产装载机https://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/assets/loaders/AsynchronousAssetLoader.html – dfour

+0

@dfourWill你为AsynchronusAssetLoader添加一个例子吗?我找不到任何东西。 – Niranjana

+1

这些例子是现有装载机的源代码。 – Tenfour04

回答

0

您可以使用libgdx AsynchronousAssetLoader接口定义您自己的加载程序。该代码来自BitmapFont加载器,该加载器加载字体并且具有需要加载的额外文件。

package com.badlogic.gdx.assets.loaders; 

import com.badlogic.gdx.Gdx; 
import com.badlogic.gdx.assets.AssetDescriptor; 
import com.badlogic.gdx.assets.AssetLoaderParameters; 
import com.badlogic.gdx.assets.AssetManager; 
import com.badlogic.gdx.files.FileHandle; 
import com.badlogic.gdx.graphics.Texture; 
import com.badlogic.gdx.graphics.Texture.TextureFilter; 
import com.badlogic.gdx.graphics.g2d.BitmapFont; 
import com.badlogic.gdx.graphics.g2d.BitmapFont.BitmapFontData; 
import com.badlogic.gdx.graphics.g2d.TextureAtlas; 
import com.badlogic.gdx.graphics.g2d.TextureAtlas.AtlasRegion; 
import com.badlogic.gdx.graphics.g2d.TextureRegion; 
import com.badlogic.gdx.scenes.scene2d.ui.Skin; 
import com.badlogic.gdx.utils.Array; 
import com.badlogic.gdx.utils.GdxRuntimeException; 

/** {@link AssetLoader} for {@link BitmapFont} instances. Loads the font description file (.fnt) asynchronously, loads the 
* {@link Texture} containing the glyphs as a dependency. The {@link BitmapFontParameter} allows you to set things like texture 
* filters or whether to flip the glyphs vertically. 
* @author mzechner */ 
public class BitmapFontLoader extends AsynchronousAssetLoader<BitmapFont, BitmapFontLoader.BitmapFontParameter> { 
    public BitmapFontLoader (FileHandleResolver resolver) { 
     super(resolver); 
    } 

    BitmapFontData data; 

    @Override 
    public Array<AssetDescriptor> getDependencies (String fileName, FileHandle file, BitmapFontParameter parameter) { 
     Array<AssetDescriptor> deps = new Array(); 
     if (parameter != null && parameter.bitmapFontData != null) { 
      data = parameter.bitmapFontData; 
      return deps; 
     } 

     data = new BitmapFontData(file, parameter != null ? parameter.flip : false); 
     if (parameter != null && parameter.atlasName != null) { 
      deps.add(new AssetDescriptor(parameter.atlasName, TextureAtlas.class)); 
     } else { 
      for (int i = 0; i < data.getImagePaths().length; i++) { 
       String path = data.getImagePath(i); 
       FileHandle resolved = resolve(path); 

       TextureLoader.TextureParameter textureParams = new TextureLoader.TextureParameter(); 

       if (parameter != null) { 
        textureParams.genMipMaps = parameter.genMipMaps; 
        textureParams.minFilter = parameter.minFilter; 
        textureParams.magFilter = parameter.magFilter; 
       } 

       AssetDescriptor descriptor = new AssetDescriptor(resolved, Texture.class, textureParams); 
       deps.add(descriptor); 
      } 
     } 

     return deps; 
    } 

    @Override 
    public void loadAsync (AssetManager manager, String fileName, FileHandle file, BitmapFontParameter parameter) { 
    } 

    @Override 
    public BitmapFont loadSync (AssetManager manager, String fileName, FileHandle file, BitmapFontParameter parameter) { 
     if (parameter != null && parameter.atlasName != null) { 
      TextureAtlas atlas = manager.get(parameter.atlasName, TextureAtlas.class); 
      String name = file.sibling(data.imagePaths[0]).nameWithoutExtension().toString(); 
      AtlasRegion region = atlas.findRegion(name); 

      if (region == null) 
       throw new GdxRuntimeException("Could not find font region " + name + " in atlas " + parameter.atlasName); 
      return new BitmapFont(file, region); 
     } else { 
      int n = data.getImagePaths().length; 
      Array<TextureRegion> regs = new Array(n); 
      for (int i = 0; i < n; i++) { 
       regs.add(new TextureRegion(manager.get(data.getImagePath(i), Texture.class))); 
      } 
      return new BitmapFont(data, regs, true); 
     } 
    } 

    /** Parameter to be passed to {@link AssetManager#load(String, Class, AssetLoaderParameters)} if additional configuration is 
    * necessary for the {@link BitmapFont}. 
    * @author mzechner */ 
    static public class BitmapFontParameter extends AssetLoaderParameters<BitmapFont> { 
     /** Flips the font vertically if {@code true}. Defaults to {@code false}. **/ 
     public boolean flip = false; 

     /** Generates mipmaps for the font if {@code true}. Defaults to {@code false}. **/ 
     public boolean genMipMaps = false; 

     /** The {@link TextureFilter} to use when scaling down the {@link BitmapFont}. Defaults to {@link TextureFilter#Nearest}. */ 
     public TextureFilter minFilter = TextureFilter.Nearest; 

     /** The {@link TextureFilter} to use when scaling up the {@link BitmapFont}. Defaults to {@link TextureFilter#Nearest}. */ 
     public TextureFilter magFilter = TextureFilter.Nearest; 

     /** optional {@link BitmapFontData} to be used instead of loading the {@link Texture} directly. Use this if your font is 
     * embedded in a {@link Skin}. **/ 
     public BitmapFontData bitmapFontData = null; 

     /** The name of the {@link TextureAtlas} to load the {@link BitmapFont} itself from. Optional; if {@code null}, will look for 
     * a separate image */ 
     public String atlasName = null; 
    } 
} 

主要的想法是有一个参数类定义了所有加载你的资产,然后在load方法创建并返回您的资产对象所需的额外部分。