package info.u250.c2d.engine.resources; import info.u250.c2d.engine.Engine; import info.u250.c2d.engine.resources.looper.LoopLoader; import info.u250.c2d.engine.resources.looper.LoopLoaderDesktop; import info.u250.c2d.engine.resources.looper.LoopLoaderGeneral; import info.u250.c2d.engine.resources.looper.LoopLoaderWebGL; import info.u250.c2d.engine.resources.rules.RuleFont; import info.u250.c2d.engine.resources.rules.RuleMusic; import info.u250.c2d.engine.resources.rules.RuleParticleEffect; import info.u250.c2d.engine.resources.rules.RuleSkin; import info.u250.c2d.engine.resources.rules.RuleSound; import info.u250.c2d.engine.resources.rules.RuleTexture; import info.u250.c2d.engine.resources.rules.RuleTextureAtlas; import info.u250.c2d.engine.resources.rules.RuleTmxMap; import java.util.HashMap; import java.util.Map; import com.badlogic.gdx.Application.ApplicationType; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.audio.Music; import com.badlogic.gdx.audio.Sound; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.BitmapFont; import com.badlogic.gdx.graphics.g2d.ParticleEffect; import com.badlogic.gdx.graphics.g2d.TextureAtlas; import com.badlogic.gdx.scenes.scene2d.ui.Skin; import com.badlogic.gdx.utils.Array; /** * @author lycying@gmail.com */ public class AliasResourceManager<K> { public AliasResourceManager(){ if(Gdx.app.getType() == ApplicationType.Desktop){ loopLoader = new LoopLoaderDesktop(); }else if(Gdx.app.getType() == ApplicationType.WebGL){ loopLoader = new LoopLoaderWebGL(); }else{ loopLoader = new LoopLoaderGeneral(); } } private LoopLoader loopLoader ; public void setLoopLoader(LoopLoader loopLoader) { this.loopLoader = loopLoader; } /**the map to hold all resources*/ private Map<K, Object> resources = new HashMap<K, Object>(); /**the map to hold all resources's alias*/ private Map<K, String> resources_alias = new HashMap<K, String>(); /**remove the resources use the key */ public synchronized void unload(String key){ String key_alias = resources_alias.get(key); if(null!=key_alias){ Engine.getAssetManager().unload(key_alias); resources_alias.remove(key); } resources.remove(key); } /** a simple method to get the real resources */ @SuppressWarnings("unchecked") public <T> T get(K id) { return (T)resources.get(id); } /** quick access texture*/ public void texture(K key,String res){ this.resources.put(key, Engine.getAssetManager().get(res, Texture.class)); this.resources_alias.put(key, res); } /** quick access sound resource */ public void sound(K key,String res){ this.resources.put(key, Engine.getAssetManager().get(res, Sound.class)); this.resources_alias.put(key, res); } /** quick access music resource */ public void music(K key,String res){ this.resources.put(key, Engine.getAssetManager().get(res, Music.class)); this.resources_alias.put(key, res); } /** quick access texture atlas */ public void textureAtlas(K key,String res){ this.resources.put(key, Engine.getAssetManager().get(res, TextureAtlas.class)); this.resources_alias.put(key, res); } /** quick access bitmap font */ public void font(K key,String res){ this.resources.put(key, Engine.getAssetManager().get(res, BitmapFont.class)); this.resources_alias.put(key, res); } /** quick access skin */ public void skin(K key,String res){ this.resources.put(key, Engine.getAssetManager().get(res, Skin.class)); this.resources_alias.put(key, res); } /** quick access particle */ public void particleEffect(K key,String res){ this.resources.put(key, Engine.getAssetManager().get(res, ParticleEffect.class)); this.resources_alias.put(key, res); } /** quickly put any type resource object */ public <T> void object(K key,T res){ this.resources.put(key, res); } /**load resources*/ public void load(String dataDir){ loopLoader.loadResource(dataDir); } public static Array<LoadResourceRule> RULES = new Array<LoadResourceRule>(); static{ RULES.add(new RuleTexture()); RULES.add(new RuleSound()); RULES.add(new RuleMusic()); RULES.add(new RuleTextureAtlas()); RULES.add(new RuleFont()); RULES.add(new RuleSkin()); RULES.add(new RuleTmxMap()); RULES.add(new RuleParticleEffect()); } public void addRule(LoadResourceRule rule){ RULES.add(rule); } /** * @author lycying@gmail.com * this is a rule to load resources , if the file's suffix or contains dictionary match the load rule , then load it . * such as the texture has the suffix ".png" */ public interface LoadResourceRule{ public boolean match(FileHandle file); } }