package org.anddev.andengine.entity.sprite.batch; import java.util.ArrayList; import org.anddev.andengine.entity.IEntity; import org.anddev.andengine.entity.sprite.BaseSprite; import org.anddev.andengine.opengl.texture.ITexture; import org.anddev.andengine.opengl.texture.region.buffer.SpriteBatchTextureRegionBuffer; import org.anddev.andengine.opengl.vertex.SpriteBatchVertexBuffer; import org.anddev.andengine.util.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) { super(pTexture, pCapacity); /* Make children not be drawn automatically, as we handle the drawing ourself. */ this.setChildrenVisible(false); } public SpriteGroup(final ITexture pTexture, final int pCapacity, final SpriteBatchVertexBuffer pSpriteBatchVertexBuffer, final SpriteBatchTextureRegionBuffer pSpriteBatchTextureRegionBuffer) { super(pTexture, pCapacity, pSpriteBatchVertexBuffer, pSpriteBatchTextureRegionBuffer); /* 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 BaseSprite) { this.attachChild((BaseSprite)pEntity); } else { throw new IllegalArgumentException("A SpriteGroup can only handle children of type BaseSprite or subclasses of BaseSprite, like Sprite, TiledSprite or AnimatedSprite."); } } public void attachChild(final BaseSprite pBaseSprite) { this.assertCapacity(); this.assertTexture(pBaseSprite.getTextureRegion()); super.attachChild(pBaseSprite); } public void attachChildren(final ArrayList<? extends BaseSprite> pBaseSprites) { final int baseSpriteCount = pBaseSprites.size(); for(int i = 0; i < baseSpriteCount; i++) { this.attachChild(pBaseSprites.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++) { super.drawWithoutChecks((BaseSprite)children.get(i)); } return true; } } // =========================================================== // Methods // =========================================================== private void assertCapacity() { if(this.getChildCount() >= this.mCapacity) { throw new IllegalStateException("This SpriteGroup has already reached its capacity (" + this.mCapacity + ") !"); } } // =========================================================== // Inner and Anonymous Classes // =========================================================== }