package stu.tnt.gdx.graphics.graphics2d; import stu.tnt.gdx.utils.Updater; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.g2d.Batch; import com.badlogic.gdx.utils.Disposable; /** * NativeSpriteBackend.java * * Created on: Oct 7, 2012 Author: Trung */ public abstract class NativeSpriteBackend implements SpriteBackend, Disposable { public final long address; final NWorld world; NManager manager = null; NSpriteDef def = null; // ========================================= boolean isPooled = false; boolean isDisposed = false; /***************************************************** Constructor *****************************************************/ NativeSpriteBackend(long address, NWorld world) { this.address = address; this.world = world; world.mSpriteMap.put(address, this); } // ======================================= // sprite def public void noSpriteDef() { if (this.def != null) this.def.mSpriteCount--; noSpriteDef(address); this.def = null; } public void setSpriteDef(NSpriteDef def) { if (this.def != null) this.def.mSpriteCount--; def.mSpriteCount++; setSpriteDef(address, def.address); this.def = def; } public void setSpriteDef(String spriteDefName) { if (this.def != null) this.def.mSpriteCount--; NSpriteDef def = world.getSpriteDef(spriteDefName); def.mSpriteCount++; setSpriteDef(address, def.address); this.def = def; } public NSpriteDef getSpriteDef() { return def; } // ======================================= // manager public void setManager(NManager manager) { manager.manage(this); } public NManager getManager() { return manager; } // ======================================== // utils /** If true manager will calculate collision for this sprite */ public void setCollision(boolean isCollision) { setCollision(address, isCollision); } /** this is not safe method just for testing */ public float[] getTransformedBounding(int index) { return getTransformedBounding(address, index); } public boolean isPooled() { return isPooled; } /***************************************************** SpriteBackend *****************************************************/ // ================================================= // setter public abstract void setBounds(float x, float y, float width, float height); public abstract void setSize(float width, float height); public abstract void setPosition(float x, float y); public abstract void setX(float x); public abstract void setY(float y); public abstract void translate(float xAmount, float yAmount); public abstract void translateX(float xAmount); public abstract void translateY(float yAmount); public abstract void setOrigin(float originX, float originY); public abstract void setRotation(float degree); public abstract void rotate(float degree); public abstract void setScale(float scaleXY); public abstract void setScale(float scaleX, float scaleY); public abstract void scale(float amount); public abstract void setColor(float r, float g, float b, float a); public abstract void setColor(Color color); // ================================================= // getter public abstract float[] getVertices(); public abstract float getX(); public abstract float getCenterX(); public abstract float getY(); public abstract float getCenterY(); public abstract float getWidth(); public abstract float getHeight(); public abstract float getOriginX(); public abstract float getOriginY(); public abstract float getRotation(); public abstract float getScaleX(); public abstract float getScaleY(); // ================================================= // processor public abstract void postUpdater(Updater updater); public abstract void noUpdater(); public abstract void update(float delta); public abstract void draw(Batch batch); public abstract void draw(Batch batch, float alpha); // ============================================== // dispose /** * 1. unmanage from manager 2. world remove sprite 3. dispose 4. isPooled * and isDispose = true */ public void dispose() { if (isDisposed) return; manager.unmanage(this); manager = null; world.deleteSprite(this); dispose(address); def = null; noSpriteDef(); isDisposed = true; isPooled = true; } /** * 1. reset all vertices to zero. 2. reset color to white, scale to 1 3. * remove from manager 4. world pool this sprite 5. manager = null, def = * null 6. isPooled = true */ public void reset() { if (isPooled) return; manager.unmanage(this); manager = null; world.poolSprite(this); reset(address); def = null; noSpriteDef(); isPooled = true; } void unmanage() { unmanage(address); } /****************************************************** Native method ******************************************************/ // ============================================== // setter protected final native void setOriginSize(long address, float width, float height); protected final native void setBounds(long address, float x, float y, float width, float height); protected final native void setSize(long address, float width, float height); protected final native void setPosition(long address, float x, float y); protected final native void setX(long address, float x); protected final native void setY(long address, float y); protected final native void translate(long address, float xAmount, float yAmount); protected final native void translateX(long address, float xAmount); protected final native void translateY(long address, float yAmount); protected final native void setOrigin(long address, float originX, float originY); protected final native void setRotation(long address, float degree); protected final native void rotate(long address, float degree); protected final native void setScale(long address, float scaleXY); protected final native void setScale(long address, float scaleX, float scaleY); protected final native void scale(long address, float amount); // ======================================================= // getter protected final native void getVertices(long address, float[] vertices); protected final native float getX(long address); protected final native float getCenterX(long address); protected final native float getY(long address); protected final native float getCenterY(long address); protected final native float getWidth(long address); protected final native float getHeight(long address); protected final native float getOriginX(long address); protected final native float getOriginY(long address); protected final native float getRotation(long address); protected final native float getScaleX(long address); protected final native float getScaleY(long address); private final native float[] getTransformedBounding(long address, int index); final native boolean isDirty(long address); // =============================================== // processor protected final native void reset(long address); protected final native void dispose(long address); private final native void unmanage(long address); private final native void setSpriteDef(long address, long spritedef); private final native void noSpriteDef(long address); private final native void setCollision(long address, boolean isCollision); // ============= debug method ============= public String info() { String s = " X: " + getX() + " Y: " + getY() + " Width: " + getWidth() + " Height: " + getHeight() + " CenterX: " + getCenterX() + " CenterY: " + getCenterY() + " OriginX: " + getOriginX() + " OriginY: " + getOriginY() + " Rotation: " + getRotation(); return s; } }