package org.andengine.entity.sprite.batch;
import java.util.ArrayList;
import org.andengine.entity.IEntity;
import org.andengine.entity.sprite.Sprite;
import org.andengine.entity.sprite.batch.vbo.ISpriteBatchVertexBufferObject;
import org.andengine.opengl.shader.ShaderProgram;
import org.andengine.opengl.texture.ITexture;
import org.andengine.opengl.vbo.DrawType;
import org.andengine.opengl.vbo.VertexBufferObjectManager;
import org.andengine.util.adt.list.SmartList;
/**
* (c) 2010 Nicolas Gramlich
* (c) 2011 Zynga Inc.
*
* @author Nicolas Gramlich
* @since 12:10:35 - 15.06.2011
*/
public class SpriteGroup extends DynamicSpriteBatch {
// ===========================================================
// Constants
// ===========================================================
// ===========================================================
// Fields
// ===========================================================
// ===========================================================
// Constructors
// ===========================================================
public SpriteGroup(final ITexture pTexture, final int pCapacity, final VertexBufferObjectManager pVertexBufferObjectManager) {
super(pTexture, pCapacity, pVertexBufferObjectManager);
/* Make children not be drawn automatically, as we handle the drawing ourself. */
this.setChildrenVisible(false);
}
public SpriteGroup(final float pX, final float pY, final ITexture pTexture, final int pCapacity, final VertexBufferObjectManager pVertexBufferObjectManager) {
super(pX, pY, pTexture, pCapacity, pVertexBufferObjectManager);
/* Make children not be drawn automatically, as we handle the drawing ourself. */
this.setChildrenVisible(false);
}
public SpriteGroup(final ITexture pTexture, final int pCapacity, final VertexBufferObjectManager pVertexBufferObjectManager, final DrawType pDrawType) {
super(pTexture, pCapacity, pVertexBufferObjectManager, pDrawType);
/* Make children not be drawn automatically, as we handle the drawing ourself. */
this.setChildrenVisible(false);
}
public SpriteGroup(final float pX, final float pY, final ITexture pTexture, final int pCapacity, final VertexBufferObjectManager pVertexBufferObjectManager, final DrawType pDrawType) {
super(pX, pY, pTexture, pCapacity, pVertexBufferObjectManager, pDrawType);
/* Make children not be drawn automatically, as we handle the drawing ourself. */
this.setChildrenVisible(false);
}
public SpriteGroup(final ITexture pTexture, final int pCapacity, final VertexBufferObjectManager pVertexBufferObjectManager, final ShaderProgram pShaderProgram) {
super(pTexture, pCapacity, pVertexBufferObjectManager, pShaderProgram);
/* Make children not be drawn automatically, as we handle the drawing ourself. */
this.setChildrenVisible(false);
}
public SpriteGroup(final float pX, final float pY, final ITexture pTexture, final int pCapacity, final VertexBufferObjectManager pVertexBufferObjectManager, final ShaderProgram pShaderProgram) {
super(pX, pY, pTexture, pCapacity, pVertexBufferObjectManager, pShaderProgram);
/* Make children not be drawn automatically, as we handle the drawing ourself. */
this.setChildrenVisible(false);
}
public SpriteGroup(final ITexture pTexture, final int pCapacity, final VertexBufferObjectManager pVertexBufferObjectManager, final DrawType pDrawType, final ShaderProgram pShaderProgram) {
super(pTexture, pCapacity, pVertexBufferObjectManager, pDrawType, pShaderProgram);
/* Make children not be drawn automatically, as we handle the drawing ourself. */
this.setChildrenVisible(false);
}
public SpriteGroup(final float pX, final float pY, final ITexture pTexture, final int pCapacity, final VertexBufferObjectManager pVertexBufferObjectManager, final DrawType pDrawType, final ShaderProgram pShaderProgram) {
super(pX, pY, pTexture, pCapacity, pVertexBufferObjectManager, pDrawType, pShaderProgram);
/* Make children not be drawn automatically, as we handle the drawing ourself. */
this.setChildrenVisible(false);
}
public SpriteGroup(final ITexture pTexture, final int pCapacity, final ISpriteBatchVertexBufferObject pSpriteBatchVertexBufferObject) {
super(pTexture, pCapacity, pSpriteBatchVertexBufferObject);
/* Make children not be drawn automatically, as we handle the drawing ourself. */
this.setChildrenVisible(false);
}
public SpriteGroup(final float pX, final float pY, final ITexture pTexture, final int pCapacity, final ISpriteBatchVertexBufferObject pSpriteBatchVertexBufferObject) {
super(pX, pY, pTexture, pCapacity, pSpriteBatchVertexBufferObject);
/* Make children not be drawn automatically, as we handle the drawing ourself. */
this.setChildrenVisible(false);
}
public SpriteGroup(final ITexture pTexture, final int pCapacity, final ISpriteBatchVertexBufferObject pSpriteBatchVertexBufferObject, final ShaderProgram pShaderProgram) {
super(pTexture, pCapacity, pSpriteBatchVertexBufferObject, pShaderProgram);
/* Make children not be drawn automatically, as we handle the drawing ourself. */
this.setChildrenVisible(false);
}
public SpriteGroup(final float pX, final float pY, final ITexture pTexture, final int pCapacity, final ISpriteBatchVertexBufferObject pSpriteBatchVertexBufferObject, final ShaderProgram pShaderProgram) {
super(pX, pY, pTexture, pCapacity, pSpriteBatchVertexBufferObject, pShaderProgram);
/* Make children not be drawn automatically, as we handle the drawing ourself. */
this.setChildrenVisible(false);
}
// ===========================================================
// Getter & Setter
// ===========================================================
// ===========================================================
// Methods for/from SuperClass/Interfaces
// ===========================================================
/**
* Instead use {@link SpriteGroup#attachChild(BaseSprite)}.
*/
@Override
@Deprecated
public void attachChild(final IEntity pEntity) throws IllegalArgumentException {
if(pEntity instanceof Sprite) {
this.attachChild((Sprite)pEntity);
} else {
throw new IllegalArgumentException("A " + SpriteGroup.class.getSimpleName() + " can only handle children of type Sprite or subclasses of Sprite, like TiledSprite or AnimatedSprite.");
}
}
public void attachChild(final Sprite pSprite) {
this.assertCapacity();
this.assertTexture(pSprite.getTextureRegion());
super.attachChild(pSprite);
}
public void attachChildren(final ArrayList<? extends Sprite> pSprites) {
final int baseSpriteCount = pSprites.size();
for(int i = 0; i < baseSpriteCount; i++) {
this.attachChild(pSprites.get(i));
}
}
@Override
protected boolean onUpdateSpriteBatch() {
final SmartList<IEntity> children = this.mChildren;
if(children == null) {
return false;
} else {
final int childCount = children.size();
for(int i = 0; i < childCount; i++) {
this.drawWithoutChecks((Sprite)children.get(i));
}
return true;
}
}
// ===========================================================
// Methods
// ===========================================================
private void assertCapacity() {
if(this.getChildCount() >= this.mCapacity) {
throw new IllegalStateException("This " + SpriteGroup.class.getSimpleName() + " has already reached its capacity (" + this.mCapacity + ") !");
}
}
// ===========================================================
// Inner and Anonymous Classes
// ===========================================================
}