public class

TiledTextureRegion

extends BaseTextureRegion
package org.anddev.andengine.opengl.texture.region;

import org.anddev.andengine.opengl.texture.ITexture;

/**
 * (c) 2010 Nicolas Gramlich 
 * (c) 2011 Zynga Inc.
 * 
 * @author Nicolas Gramlich
 * @since 18:14:42 - 09.03.2010
 */
public class TiledTextureRegion extends BaseTextureRegion {
	// ===========================================================
	// Constants
	// ===========================================================

	// ===========================================================
	// Fields
	// ===========================================================

	private final int mTileColumns;
	private final int mTileRows;
	private int mCurrentTileColumn;
	private int mCurrentTileRow;
	private final int mTileCount;

	// ===========================================================
	// Constructors
	// ===========================================================

	public TiledTextureRegion(final ITexture pTexture, final int pTexturePositionX, final int pTexturePositionY, final int pWidth, final int pHeight, final int pTileColumns, final int pTileRows) {
		super(pTexture, pTexturePositionX, pTexturePositionY, pWidth, pHeight);
		this.mTileColumns = pTileColumns;
		this.mTileRows = pTileRows;
		this.mTileCount = this.mTileColumns * this.mTileRows;
		this.mCurrentTileColumn = 0;
		this.mCurrentTileRow = 0;

		this.initTextureBuffer();
	}

	@Override
	protected void initTextureBuffer() {
		if(this.mTileRows != 0 && this.mTileColumns != 0) {
			super.initTextureBuffer();
		}
	}

	// ===========================================================
	// Getter & Setter
	// ===========================================================

	public int getTileCount() {
		return this.mTileCount;
	}

	public int getTileWidth() {
		return super.getWidth() / this.mTileColumns;
	}

	public int getTileHeight() {
		return super.getHeight() / this.mTileRows;
	}

	public int getCurrentTileColumn() {
		return this.mCurrentTileColumn;
	}

	public int getCurrentTileRow() {
		return this.mCurrentTileRow;
	}

	public int getCurrentTileIndex() {
		return this.mCurrentTileRow * this.mTileColumns + this.mCurrentTileColumn;
	}

	public void setCurrentTileIndex(final int pTileColumn, final int pTileRow) {
		if(pTileColumn != this.mCurrentTileColumn || pTileRow != this.mCurrentTileRow) {
			this.mCurrentTileColumn = pTileColumn;
			this.mCurrentTileRow = pTileRow;
			super.updateTextureRegionBuffer();
		}
	}

	public void setCurrentTileIndex(final int pTileIndex) {
		if(pTileIndex < this.mTileCount) {
			final int tileColumns = this.mTileColumns;
			this.setCurrentTileIndex(pTileIndex % tileColumns, pTileIndex / tileColumns);
		}
	}

	public int getTexturePositionOfCurrentTileX() {
		return super.getTexturePositionX() + this.mCurrentTileColumn * this.getTileWidth();
	}

	public int getTexturePositionOfCurrentTileY() {
		return super.getTexturePositionY() + this.mCurrentTileRow * this.getTileHeight();
	}

	// ===========================================================
	// Methods for/from SuperClass/Interfaces
	// ===========================================================

	@Override
	public TiledTextureRegion deepCopy() {
		final TiledTextureRegion deepCopy = new TiledTextureRegion(this.mTexture, this.getTexturePositionX(), this.getTexturePositionY(), this.getWidth(), this.getHeight(), this.mTileColumns, this.mTileRows);
		deepCopy.setCurrentTileIndex(this.mCurrentTileColumn, this.mCurrentTileRow);
		return deepCopy;
	}

	@Override
	public float getTextureCoordinateX1() {
		return (float)this.getTexturePositionOfCurrentTileX() / this.mTexture.getWidth();
	}

	@Override
	public float getTextureCoordinateY1() {
		return (float)this.getTexturePositionOfCurrentTileY() / this.mTexture.getHeight();
	}

	@Override
	public float getTextureCoordinateX2() {
		return (float)(this.getTexturePositionOfCurrentTileX() + this.getTileWidth()) / this.mTexture.getWidth();
	}

	@Override
	public float getTextureCoordinateY2() {
		return (float)(this.getTexturePositionOfCurrentTileY() + this.getTileHeight()) / this.mTexture.getHeight();
	}
	
	// ===========================================================
	// Methods
	// ===========================================================

	public void nextTile() {
		final int tileIndex = (this.getCurrentTileIndex() + 1) % this.getTileCount();
		this.setCurrentTileIndex(tileIndex);
	}

	// ===========================================================
	// Inner and Anonymous Classes
	// ===========================================================
}