package stu.tnt.gdx.graphics.graphics2d;
import java.util.ArrayList;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.graphics.g2d.Sprite;
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(Batch spriteBatch) {
super.draw(spriteBatch);
for (int i = 0; i < sprites.size(); i++) {
sprites.get(i).draw(spriteBatch);
}
}
@Override
public void draw(Batch spriteBatch, float alphaModulation) {
super.draw(spriteBatch, alphaModulation);
for (int i = 0; i < sprites.size(); i++) {
sprites.get(i).draw(spriteBatch, alphaModulation);
}
}
}