package org.andengine.entity.shape;
import org.andengine.engine.camera.Camera;
import org.andengine.entity.primitive.Line;
import org.andengine.opengl.shader.ShaderProgram;
import org.andengine.util.algorithm.collision.RectangularShapeCollisionChecker;
/**
* (c) 2010 Nicolas Gramlich
* (c) 2011 Zynga Inc.
*
* @author Nicolas Gramlich
* @since 11:37:50 - 04.04.2010
*/
public abstract class RectangularShape extends Shape implements IAreaShape {
// ===========================================================
// Constants
// ===========================================================
// ===========================================================
// Fields
// ===========================================================
protected float mWidth;
protected float mHeight;
// ===========================================================
// Constructors
// ===========================================================
public RectangularShape(final float pX, final float pY, final float pWidth, final float pHeight, final ShaderProgram pShaderProgram) {
super(pX, pY, pShaderProgram);
this.mWidth = pWidth;
this.mHeight = pHeight;
this.resetRotationCenter();
this.resetScaleCenter();
this.resetSkewCenter();
}
// ===========================================================
// Getter & Setter
// ===========================================================
@Override
public float getWidth() {
return this.mWidth;
}
@Override
public float getHeight() {
return this.mHeight;
}
@Override
public void setWidth(final float pWidth) {
this.mWidth = pWidth;
this.onUpdateVertices();
}
@Override
public void setHeight(final float pHeight) {
this.mHeight = pHeight;
this.onUpdateVertices();
}
@Override
public void setSize(final float pWidth, final float pHeight) {
this.mWidth = pWidth;
this.mHeight = pHeight;
this.onUpdateVertices();
}
@Override
public float getWidthScaled() {
return this.getWidth() * this.mScaleX;
}
@Override
public float getHeightScaled() {
return this.getHeight() * this.mScaleY;
}
// ===========================================================
// Methods for/from SuperClass/Interfaces
// ===========================================================
@Override
public boolean isCulled(final Camera pCamera) {
return !RectangularShapeCollisionChecker.isVisible(pCamera, this);
}
@Override
public void reset() {
super.reset();
this.resetRotationCenter();
this.resetSkewCenter();
this.resetScaleCenter();
}
@Override
public boolean contains(final float pX, final float pY) {
return RectangularShapeCollisionChecker.checkContains(this, pX, pY);
}
@Override
public float[] getSceneCenterCoordinates() {
return this.convertLocalToSceneCoordinates(this.mWidth * 0.5f, this.mHeight * 0.5f);
}
@Override
public float[] getSceneCenterCoordinates(final float[] pReuse) {
return this.convertLocalToSceneCoordinates(this.mWidth * 0.5f, this.mHeight * 0.5f, pReuse);
}
@Override
public boolean collidesWith(final IShape pOtherShape) {
if(pOtherShape instanceof RectangularShape) {
return RectangularShapeCollisionChecker.checkCollision(this, (RectangularShape) pOtherShape);
} else if(pOtherShape instanceof Line) {
return RectangularShapeCollisionChecker.checkCollision(this, (Line) pOtherShape);
} else {
return false;
}
}
// ===========================================================
// Methods
// ===========================================================
public void resetRotationCenter() {
this.mRotationCenterX = this.mWidth * 0.5f;
this.mRotationCenterY = this.mHeight * 0.5f;
}
public void resetScaleCenter() {
this.mScaleCenterX = this.mWidth * 0.5f;
this.mScaleCenterY = this.mHeight * 0.5f;
}
public void resetSkewCenter() {
this.mSkewCenterX = this.mWidth * 0.5f;
this.mSkewCenterY = this.mHeight * 0.5f;
}
// ===========================================================
// Inner and Anonymous Classes
// ===========================================================
}