Jump to content

AtlasLoader with assetmanager (LibGDX)


JasonCh

Recommended Posts

Is there an official way to use AtlasLoader with AssetManager? My current solution is to modify AtlasLoader.java to check for assetmanager being assigned and to use that instead.

My modifications in bold.

    public static AssetManager assetManager = null;

    public AtlasLoader(Data data, FileHandle atlas, String indexPrefix) {
        super(data);
        if (assetManager == null)
            this.atlas = new TextureAtlas(atlas);
        else
            this.atlas = assetManager.get(atlas.path(), TextureAtlas.class);

        Array<AtlasRegion> array = this.atlas.getRegions();
        for(int i = 0; i < array.size; i++){
            AtlasRegion region = array.get(i);
            if(region.index != -1) region.name = region.name+indexPrefix+region.index;
        }
    }

 

This minor modification allowed me to write my own AsynchronousAssetLoader for scml files but the catch is I have to load the .atlas file using assetmanager first before I load the .scml file,

If anyone else is interested in my example usage of AtlasLoader with custom AsynchronosAssetLoader, feel free to copy and modify it. I couldn't find a working sample to do this online so finally managed to get it done myself.

 

SpriterObjectLoader.java

import com.badlogic.gdx.assets.AssetDescriptor;
import com.badlogic.gdx.assets.AssetManager;
import com.badlogic.gdx.assets.loaders.AsynchronousAssetLoader;
import com.badlogic.gdx.assets.loaders.FileHandleResolver;
import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.utils.Array;

/**
 * Created by jason on 1/2/2017.
 */

public class SpriterObjectLoader extends AsynchronousAssetLoader<SpriterObject, SpriterObjectParameter> {


    public SpriterObjectLoader(FileHandleResolver resolver) {
        super(resolver);
    }

    SpriterObject spriterObject = null;

    @Override
    public void loadAsync(AssetManager manager, String fileName, FileHandle file, SpriterObjectParameter parameter) {
        //return new SpriterObject(fileName, parameter.batch, parameter.renderer, parameter.assetManager);
        this.spriterObject = new SpriterObject(fileName, parameter.batch, parameter.renderer, manager);
    }

    @Override
    public SpriterObject loadSync(AssetManager manager, String fileName, FileHandle file, SpriterObjectParameter parameter) {
        SpriterObject so = this.spriterObject;
        this.spriterObject = null;
        return so;
    }
/*
    @Override
    public SpriterObject load(AssetManager manager, String fileName, FileHandle file, SpriterObjectParameter parameter) {
        return new SpriterObject(fileName, parameter.batch, parameter.renderer, parameter.assetManager);
    }*/

    @Override
    public Array<AssetDescriptor> getDependencies(String fileName, FileHandle file, SpriterObjectParameter parameter) {

        return null;

    }

}

 

SpriterObject.java

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.assets.AssetManager;
import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
import com.badlogic.gdx.utils.Disposable;
import com.brashmonkey.spriter.Player;
import com.brashmonkey.spriter.SCMLReader;
import com.brashmonkey.spriter.gdx.AtlasLoader;
import com.brashmonkey.spriter.gdx.Drawer;

/**
 * Created by jason on 1/2/2017.
 */

public class SpriterObject implements Disposable {
    public Player player;
    public Drawer drawer;
    public AtlasLoader loader;

    FileHandle scmlFile;
    SCMLReader reader;
    FileHandle atlasFile;

    public SpriterObject(String fileName, SpriteBatch batch, ShapeRenderer renderer, AssetManager assetManager) {

        scmlFile = Gdx.files.internal(fileName);
        reader = new SCMLReader(scmlFile.read());

        atlasFile = Gdx.files.internal(scmlFile.pathWithoutExtension() + ".atlas");
        AtlasLoader.assetManager = assetManager;
        loader = new AtlasLoader(reader.getData(), atlasFile);
        loader.load("");

        drawer = new Drawer(loader, batch, renderer);

        player = new Player(reader.getData().getEntity(0));
        player.flipY();
    }

    public void draw()
    {
        drawer.draw(player);
    }

    public void draw(float x, float y)
    {
        player.setPosition(x, y);
        drawer.draw(player);
    }

    public void dispose()
    {
        if (loader != null) {
            loader.dispose();
            loader = null;
            Gdx.app.log("SpriterObject", "dispose " + scmlFile.name());
        }
    }

}

 

Sample usage

public void create () {

   manager = new AssetManager();

   manager.setLoader(SpriterObject.class, new SpriterObjectLoader(new InternalFileHandleResolver()));

   batch = new SpriteBatch();

   renderer = new ShapeRenderer();

   SpriterObjectParameter param = new SpriterObjectParameter();
   param.renderer = renderer;
   param.batch = batch;

   manager.load("jetcat/jetcat.atlas", TextureAtlas.class); //Load this atlas first before scml file.

   manager.load("jetcat/jetcat.scml", SpriterObject.class, param);

}
public void render () {

   Gdx.gl.glClearColor(1, 0, 0, 1);
   Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

   if (manager.update()) {
      if (spriterObject == null) {
         spriterObject = manager.get("jetcat/jetcat.scml", SpriterObject.class);
         spriterObject.player.setAnimation("jetcat_center");
         spriterObject.player.setPosition(600, 300);
      }

      spriterObject.player.update();
      batch.setProjectionMatrix(cam.combined);
      batch.begin();    
      spriterObject.draw();
      batch.end();
      
   }
}

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...