package com.cookbook.assetmanager;
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.ObjectMap;
import com.cookbook.animation.SpriteAnimationData;
import com.cookbook.animation.SpriteAnimationLoader;
public class Assets implements Disposable, AssetErrorListener {
private static final String TAG = "Assets";
private AssetManager manager;
private ObjectMap<String, Array<Asset>> groups;
public Assets(String assetFile) {
manager = new AssetManager();
manager.setErrorListener(this);
manager.setLoader(TiledMap.class, new TmxMapLoader(new InternalFileHandleResolver()));
manager.setLoader(SpriteAnimationData.class, new SpriteAnimationLoader(new InternalFileHandleResolver()));
loadGroups(assetFile);
}
public AssetLoader<?, ?> getLoader(Class<?> type) {
return manager.getLoader(type);
}
public void loadGroup(String groupName) {
Gdx.app.log(TAG, "loading group " + groupName);
Array<Asset> assets = groups.get(groupName, null);
if (assets != null) {
for (Asset asset : assets) {
Gdx.app.log(TAG, "loading..." + asset.path);
manager.load(asset.path, asset.type, asset.parameters);
}
}
else {
Gdx.app.log(TAG, "error loading group " + groupName + ", not found");
}
}
public void unloadGroup(String groupName) {
Gdx.app.log(TAG, "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 {
Gdx.app.log(TAG, "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() {
Gdx.app.log(TAG, "shutting down");
manager.dispose();
}
@Override
public void error(AssetDescriptor asset, Throwable throwable) {
Gdx.app.log(TAG, "error loading " + asset.fileName + " message: " + throwable.getMessage());
}
private void loadGroups(String assetFile) {
groups = new ObjectMap<String, Array<Asset>>();
Gdx.app.log(TAG, "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)) {
Gdx.app.log(TAG, "group " + groupValue.name + " already exists, skipping");
continue;
}
Gdx.app.log(TAG, "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) {
Gdx.app.log(TAG, "error loading file " + assetFile + " " + e.getMessage());
}
}
}