package com.siondream.core; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.g2d.ParticleEffect; import com.badlogic.gdx.graphics.g2d.ParticleEffectPool; import com.badlogic.gdx.graphics.g2d.ParticleEffectPool.PooledEffect; import com.badlogic.gdx.utils.Disposable; import com.badlogic.gdx.utils.JsonReader; import com.badlogic.gdx.utils.JsonValue; import com.badlogic.gdx.utils.Logger; import com.badlogic.gdx.utils.ObjectMap; import com.badlogic.gdx.utils.JsonValue.JsonIterator; import com.badlogic.gdx.utils.ObjectMap.Values; public class ParticleEffectPools implements Disposable { private final static String TAG = "ParticleEffectPools"; private final static String PARTICLES_FOLDER = "data/particles"; private final static String PARTICLES_FILE = PARTICLES_FOLDER + "/" + "particles.json"; private Logger logger; private ObjectMap<String, ParticleEffectPool> pools; public ParticleEffectPools() { logger = new Logger(TAG, Env.debugLevel); logger.info("initialising"); pools = new ObjectMap<String, ParticleEffectPool>(); try { JsonReader reader = new JsonReader(); JsonValue root = reader.parse(Gdx.files.internal(PARTICLES_FILE)); JsonIterator particlesIt = root.iterator(); while (particlesIt.hasNext()) { JsonValue particleValue = particlesIt.next(); String effectName = particleValue.asString(); logger.info("loading " + effectName); ParticleEffect effect = new ParticleEffect(); effect.load(Gdx.files.internal(effectName), Gdx.files.internal(PARTICLES_FOLDER)); pools.put(effectName, new ParticleEffectPool(effect, Env.particlePoolInitialCapacity, Env.particlePoolMaxCapacity)); } } catch (Exception e) { logger.error("failed to list directory " + PARTICLES_FILE); } } public PooledEffect obtain(String name) { ParticleEffectPool pool = pools.get(name); if (pool == null) { logger.error("pool not found " + name); return null; } return pool.obtain(); } public void free(PooledEffect effect) { Values<ParticleEffectPool> values = pools.values(); while (values.hasNext) { values.next().free(effect); } } public void clear() { Values<ParticleEffectPool> values = pools.values(); while (values.hasNext) { values.next().clear(); } } @Override public void dispose() { logger.info("shutting down"); clear(); } }