package com.siondream.core.assets; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.assets.AssetDescriptor; import com.badlogic.gdx.assets.AssetErrorListener; import com.badlogic.gdx.assets.AssetManager; import com.badlogic.gdx.assets.loaders.AssetLoader; import com.badlogic.gdx.assets.loaders.resolvers.InternalFileHandleResolver; import com.badlogic.gdx.maps.tiled.TiledMap; import com.badlogic.gdx.maps.tiled.TmxMapLoader; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Disposable; import com.badlogic.gdx.utils.Json; import com.badlogic.gdx.utils.JsonReader; import com.badlogic.gdx.utils.JsonValue; import com.badlogic.gdx.utils.JsonValue.JsonIterator; import com.badlogic.gdx.utils.Logger; import com.badlogic.gdx.utils.ObjectMap; import com.esotericsoftware.spine.AnimationStateData; import com.esotericsoftware.spine.SkeletonData; import com.siondream.core.Env; import com.siondream.core.animation.SpriteAnimationData; import com.siondream.core.animation.SpriteAnimationLoader; import com.siondream.core.physics.PhysicsData; import com.siondream.core.physics.PhysicsLoader; import com.siondream.core.spine.AnimationStateDataLoader; import com.siondream.core.spine.SkeletonDataLoader; public class Assets implements Disposable, AssetErrorListener { private static final String TAG = "Assets"; private Logger logger; private AssetManager manager; private ObjectMap<String, Array<Asset>> groups; public Assets(String assetFile) { logger = new Logger(TAG, Env.debugLevel); logger.info("initialising"); manager = new AssetManager(); // manager.setErrorListener(this); manager.setLoader(TiledMap.class, new TmxMapLoader(new InternalFileHandleResolver())); manager.setLoader(PhysicsData.class, new PhysicsLoader(new InternalFileHandleResolver())); manager.setLoader(SpriteAnimationData.class, new SpriteAnimationLoader(new InternalFileHandleResolver())); manager.setLoader(SkeletonData.class, new SkeletonDataLoader(new InternalFileHandleResolver())); manager.setLoader(AnimationStateData.class, new AnimationStateDataLoader(new InternalFileHandleResolver())); loadGroups(assetFile); } public AssetLoader<?, ?> getLoader(Class<?> type) { return manager.getLoader(type); } public void loadGroup(String groupName) { logger.info("loading group " + groupName); Array<Asset> assets = groups.get(groupName, null); if (assets != null) { for (Asset asset : assets) { manager.load(asset.path, asset.type, asset.parameters); } } else { logger.error("error loading group " + groupName + ", not found"); } } public void unloadGroup(String groupName) { logger.info("unloading group " + groupName); Array<Asset> assets = groups.get(groupName, null); if (assets != null) { for (Asset asset : assets) { if (manager.isLoaded(asset.path, asset.type)) { manager.unload(asset.path); } } } else { logger.error("error unloading group " + groupName + ", not found"); } } public synchronized <T> T get(String fileName) { return manager.get(fileName); } public synchronized <T> T get(String fileName, Class<T> type) { return manager.get(fileName, type); } public <T> boolean isLoaded(String fileName, Class<T> type) { return manager.isLoaded(fileName, type); } public boolean update() { return manager.update(); } public void finishLoading() { manager.finishLoading(); } public float getProgress() { return manager.getProgress(); } @Override public void dispose() { logger.info("shutting down"); manager.dispose(); } @Override public void error(AssetDescriptor asset, Throwable throwable) { logger.error("error loading " + asset.fileName + " message: " + throwable.getMessage()); } private void loadGroups(String assetFile) { groups = new ObjectMap<String, Array<Asset>>(); logger.info("loading file " + assetFile); // try { Json json = new Json(); JsonReader reader = new JsonReader(); JsonValue root = reader.parse(Gdx.files.internal(assetFile)); JsonIterator groupIt = root.iterator(); while (groupIt.hasNext()) { JsonValue groupValue = groupIt.next(); if (groups.containsKey(groupValue.name)) { logger.error("group " + groupValue.name + " already exists, skipping"); continue; } logger.info("registering group " + groupValue.name); Array<Asset> assets = new Array<Asset>(); JsonIterator assetIt = groupValue.iterator(); while (assetIt.hasNext()) { JsonValue assetValue = assetIt.next(); Asset asset = json.fromJson(Asset.class, assetValue.toString()); assets.add(asset); } groups.put(groupValue.name, assets); } // } // catch (Exception e) { // logger.error("error loading file " + assetFile + " " + e.getMessage()); // } } }