package org.andengine.engine.camera;
/**
* (c) 2010 Nicolas Gramlich
* (c) 2011 Zynga Inc.
*
* @author Nicolas Gramlich
* @since 15:55:54 - 27.07.2010
*/
public class BoundCamera extends Camera {
// ===========================================================
// Constants
// ===========================================================
// ===========================================================
// Fields
// ===========================================================
protected boolean mBoundsEnabled;
protected float mBoundsXMin;
protected float mBoundsXMax;
protected float mBoundsYMin;
protected float mBoundsYMax;
protected float mBoundsCenterX;
protected float mBoundsCenterY;
protected float mBoundsWidth;
protected float mBoundsHeight;
// ===========================================================
// Constructors
// ===========================================================
public BoundCamera(final float pX, final float pY, final float pWidth, final float pHeight) {
super(pX, pY, pWidth, pHeight);
}
public BoundCamera(final float pX, final float pY, final float pWidth, final float pHeight, final float pBoundMinX, final float pBoundMaxX, final float pBoundMinY, final float pBoundMaxY) {
super(pX, pY, pWidth, pHeight);
this.setBounds(pBoundMinX, pBoundMinY, pBoundMaxX, pBoundMaxY);
this.mBoundsEnabled = true;
}
// ===========================================================
// Getter & Setter
// ===========================================================
public boolean isBoundsEnabled() {
return this.mBoundsEnabled;
}
public void setBoundsEnabled(final boolean pBoundsEnabled) {
this.mBoundsEnabled = pBoundsEnabled;
}
public void setBounds(final float pBoundsXMin, final float pBoundsYMin, final float pBoundsXMax, final float pBoundsYMax) {
this.mBoundsXMin = pBoundsXMin;
this.mBoundsXMax = pBoundsXMax;
this.mBoundsYMin = pBoundsYMin;
this.mBoundsYMax = pBoundsYMax;
this.mBoundsWidth = this.mBoundsXMax - this.mBoundsXMin;
this.mBoundsHeight = this.mBoundsYMax - this.mBoundsYMin;
this.mBoundsCenterX = this.mBoundsXMin + this.mBoundsWidth * 0.5f;
this.mBoundsCenterY = this.mBoundsYMin + this.mBoundsHeight * 0.5f;
}
public float getBoundsXMin() {
return this.mBoundsXMin;
}
public float getBoundsXMax() {
return this.mBoundsXMax;
}
public float getBoundsYMin() {
return this.mBoundsYMin;
}
public float getBoundsYMax() {
return this.mBoundsYMax;
}
public float getBoundsWidth() {
return this.mBoundsWidth;
}
public float getBoundsHeight() {
return this.mBoundsHeight;
}
// ===========================================================
// Methods for/from SuperClass/Interfaces
// ===========================================================
@Override
public void setCenter(final float pCenterX, final float pCenterY) {
super.setCenter(pCenterX, pCenterY);
if(this.mBoundsEnabled) {
this.ensureInBounds();
}
}
// ===========================================================
// Methods
// ===========================================================
protected void ensureInBounds() {
final float centerX;
if(this.mBoundsWidth < this.getWidth()) {
centerX = this.mBoundsCenterX;
} else {
centerX = getBoundedX(this.getCenterX());
}
final float centerY;
if(this.mBoundsHeight < this.getHeight()) {
centerY = this.mBoundsCenterY;
} else {
centerY = getBoundedY(this.getCenterY());
}
super.setCenter(centerX, centerY);
}
protected float getBoundedX(final float pX) {
final float minXBoundExceededAmount = this.mBoundsXMin - this.getXMin();
final boolean minXBoundExceeded = minXBoundExceededAmount > 0;
final float maxXBoundExceededAmount = this.getXMax() - this.mBoundsXMax;
final boolean maxXBoundExceeded = maxXBoundExceededAmount > 0;
if(minXBoundExceeded) {
if(maxXBoundExceeded) {
/* Min and max X exceeded. */
return pX - maxXBoundExceededAmount + minXBoundExceededAmount;
} else {
/* Only min X exceeded. */
return pX + minXBoundExceededAmount;
}
} else {
if(maxXBoundExceeded) {
/* Only max X exceeded. */
return pX - maxXBoundExceededAmount;
} else {
/* Nothing exceeded. */
return pX;
}
}
}
protected float getBoundedY(final float pY) {
final float minYBoundExceededAmount = this.mBoundsYMin - this.getYMin();
final boolean minYBoundExceeded = minYBoundExceededAmount > 0;
final float maxYBoundExceededAmount = this.getYMax() - this.mBoundsYMax;
final boolean maxYBoundExceeded = maxYBoundExceededAmount > 0;
if(minYBoundExceeded) {
if(maxYBoundExceeded) {
/* Min and max Y exceeded. */
return pY - maxYBoundExceededAmount + minYBoundExceededAmount;
} else {
/* Only min Y exceeded. */
return pY + minYBoundExceededAmount;
}
} else {
if(maxYBoundExceeded) {
/* Only max Y exceeded. */
return pY - maxYBoundExceededAmount;
} else {
/* Nothing exceeded. */
return pY;
}
}
}
// ===========================================================
// Inner and Anonymous Classes
// ===========================================================
}