package okj.easy.graphics.graphics2d; import java.util.ArrayList; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.Sprite; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.g2d.TextureRegion; /** * Composite Sprite , a sprite which contain many other sprite and * draw at the same time. The main Sprite will be the first layout(as a background), * which mean all other sprite will be draw on the main sprite * @author trung * */ public class SpriteC extends Sprite{ private final ArrayList<Sprite> sprites; public static final byte SYN = 0; public static final byte ASYN = 1; private byte mode = 0; public SpriteC(){ sprites = new ArrayList<Sprite>(); setColor(1, 1, 1, 1); } public SpriteC(Texture texture){ this(new TextureRegion(texture)); } public SpriteC(TextureRegion region){ sprites = new ArrayList<Sprite>(); setRegion(region); setColor(1, 1, 1, 1); setSize(Math.abs(region.getRegionWidth()), Math.abs(region.getRegionHeight())); setOrigin(getWidth() / 2, getHeight() / 2); } public SpriteC(Texture texture, int srcWidth,int srcHeight){ this(new TextureRegion(texture,0,0,srcWidth,srcHeight)); } public SpriteC(Texture texture,int srcX,int srcY,int srcWidth,int srcHeight){ this(new TextureRegion(texture,srcX,srcY,srcWidth,srcHeight)); } public SpriteC(TextureRegion region,int srcX,int srcY,int srcWidth,int srcHeight){ sprites = new ArrayList<Sprite>(); setRegion(region, srcX, srcY, srcWidth, srcHeight); setColor(1, 1, 1, 1); setSize(Math.abs(srcWidth), Math.abs(srcHeight)); setOrigin(getWidth() / 2, getHeight() / 2); } /******************************************************** * SpriteC specify method *******************************************************/ public void setMode(byte spriteCMode){ this.mode = spriteCMode; } /** * If you want to add Asyn-sprite you should call setMode(byte spriteMode) * before you add sprite * @param sprite */ public void addSprite(Sprite sprite){ this.sprites.add(sprite); if(mode == SYN){ sprite.setPosition(getX(), getY()); sprite.setSize(getWidth(), getHeight()); sprite.setRotation(getRotation()); } } public void removeSprite(Sprite sprite){ this.sprites.remove(sprite); } public void removeSprite(int index){ this.sprites.remove(index); } public ArrayList<Sprite> sprites(){ return this.sprites; } /******************************************************** * *******************************************************/ @Override public void setBounds(float x, float y, float width, float height) { super.setBounds(x, y, width, height); if(mode == SYN) for (int i = 0;i < sprites.size();i++) { sprites.get(i).setBounds(x, y, width, height); } } @Override public void setSize(float width, float height) { super.setSize(width, height); if(mode == SYN) for (int i = 0;i < sprites.size();i++) { sprites.get(i).setSize(width, height); } } @Override public void setPosition(float x, float y) { super.setPosition(x, y); if(mode == SYN) for (int i = 0;i < sprites.size();i++) { sprites.get(i).setPosition(x, y); } } @Override public void translate(float xAmount, float yAmount) { super.translate(xAmount, yAmount); for (int i = 0;i < sprites.size();i++) { sprites.get(i).translate(xAmount, yAmount); } } @Override public void translateX(float xAmount) { super.translateX(xAmount); for (int i = 0;i < sprites.size();i++) { sprites.get(i).translateX(xAmount); } } @Override public void translateY(float yAmount) { super.translateY(yAmount); for (int i = 0;i < sprites.size();i++) { sprites.get(i).translateY(yAmount); } } @Override public void setOrigin(float originX, float originY) { super.setOrigin(originX, originY); if(mode == SYN) for (int i = 0;i < sprites.size();i++) { sprites.get(i).setOrigin(originX, originY); } } @Override public void setRotation(float degrees) { super.setRotation(degrees); for (int i = 0;i < sprites.size();i++) { sprites.get(i).setRotation(degrees); } } @Override public void rotate(float degrees) { super.rotate(degrees); for (int i = 0;i < sprites.size();i++) { sprites.get(i).rotate(degrees); } } @Override public void rotate90(boolean clockwise) { super.rotate90(clockwise); for (int i = 0;i < sprites.size();i++) { sprites.get(i).rotate90(clockwise); } } @Override public void setScale(float scaleXY) { super.setScale(scaleXY); if(mode == SYN) for (int i = 0;i < sprites.size();i++) { sprites.get(i).setScale(scaleXY); } } @Override public void setScale(float scaleX, float scaleY) { super.setScale(scaleX, scaleY); if(mode == SYN) for (int i = 0;i < sprites.size();i++) { sprites.get(i).setScale(scaleX, scaleY); } } @Override public void scale(float amount) { super.scale(amount); if(mode == SYN) for (int i = 0;i < sprites.size();i++) { sprites.get(i).scale(amount); } } @Override public void flip(boolean x, boolean y) { super.flip(x, y); if(mode == SYN) for (int i = 0;i < sprites.size();i++) { sprites.get(i).flip(x, y); } } @Override public void scroll(float xAmount, float yAmount) { super.scroll(xAmount, yAmount); if(mode == SYN) for (int i = 0;i < sprites.size();i++) { sprites.get(i).scroll(xAmount, yAmount); } } @Override public void draw(SpriteBatch spriteBatch) { super.draw(spriteBatch); for (int i = 0;i < sprites.size();i++) { sprites.get(i).draw(spriteBatch); } } @Override public void draw(SpriteBatch spriteBatch, float alphaModulation) { super.draw(spriteBatch, alphaModulation); for (int i = 0;i < sprites.size();i++) { sprites.get(i).draw(spriteBatch, alphaModulation); } } }