package okj.easy.graphics.graphics2d; import org.ege.utils.Updater; import org.ege.utils.exception.EasyGEngineRuntimeException; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Disposable; /** NManager.java * * Created on: Oct 7, 2012 Author: Trung */ public class NManager implements Disposable { public final long address; protected final NWorld world; private boolean isDispose; // ========================================= // sprite params final Array<NativeSpriteBackend> mSpriteList = new Array<NativeSpriteBackend>(13); // ============= for safe traverse ============= private static final Array<NativeSpriteBackend> CloneList = new Array<NativeSpriteBackend>(100); NManager (long address, NWorld world) { this.address = address; this.world = world; } public Array<NativeSpriteBackend> CloneList () { if (isDispose) return null; Array<NativeSpriteBackend> clone = new Array<NativeSpriteBackend>(mSpriteList.size); clone.addAll(mSpriteList); return clone; } public Array<NativeSpriteBackend> List () { if (isDispose) return null; return mSpriteList; } /****************************************************** manager processor ******************************************************/ public void postUpdater (Updater update) { if (isDispose) return; for (NativeSpriteBackend sprite : mSpriteList) sprite.postUpdater(update); } public void update (float delta) { if (isDispose) return; CloneList.clear(); CloneList.addAll(mSpriteList); for (NativeSpriteBackend s : CloneList) { s.update(delta); } } public void draw (SpriteBatch batch) { if (isDispose) return; for (NativeSpriteBackend s : mSpriteList) s.draw(batch); } /****************************************************** sprite manager ******************************************************/ /** Create new sprite which is manage by this manager */ public NSprite newSprite () { if (isDispose) return null; return world.newSprite(this); } /** Create new sprite which is manage by this manager */ public NSpriteA newSpriteA () { return world.newSpriteA(this); } public <T extends NSprite> T newSprite (Class<T> type) { if (isDispose) return null; return world.newSprite(type, this); } public <T extends NSpriteA> T newSpriteA (Class<T> type) { if (isDispose) return null; return world.newSpriteA(type, this); } /** 1. Check sprite is pooled ,or alread contained 2. unmanage sprite from its manager 3. manage it */ public void manage (NativeSpriteBackend sprite) { if (isDispose) return; if (sprite.isPooled || mSpriteList.contains(sprite, true)) return; if (sprite.manager != null) sprite.manager.unmanage(sprite); sprite.manager = this; mSpriteList.add(sprite); manage(address, sprite.address); } /** {@link NWorld} * * @param sprite */ public void remove (NativeSpriteBackend sprite) { if (isDispose) return; sprite.reset(); } public int size () { final int size = size(address); if (mSpriteList.size != size) throw new EasyGEngineRuntimeException("Size sync between native : " + size + " and java : " + mSpriteList.size + " is wrong"); return size; } public boolean contain (NSprite sprite) { return mSpriteList.contains(sprite, true); } /** remove from java list and native list */ void unmanage (NativeSpriteBackend sprite) { if (isDispose) return; mSpriteList.removeValue(sprite, true); sprite.unmanage(); } /****************************************************** manager self method ******************************************************/ public void clear () { if (isDispose) return; for (NativeSpriteBackend sprite : mSpriteList) sprite.reset(); mSpriteList.clear(); clear(address); } public void dispose () { if (isDispose) return; isDispose = true; for (NativeSpriteBackend sprite : mSpriteList) sprite.dispose(); mSpriteList.clear(); world.mManagerMap.remove(address); world.DisposeManager(address); } public boolean isDisposed () { return isDispose; } /****************************************************** Native method ******************************************************/ private native int size (long address); private native void manage (long managerAddress, long spriteAddress); private native void clear (long managerAddress); }