package com.amaya.game.entities.environment;
import com.amaya.game.Spacefish;
import com.amaya.game.entities.StrategyObject;
import com.amaya.game.entities.behavior.IOwnTrajectory;
import com.amaya.game.entities.behavior.IStrategy;
import com.amaya.game.entities.behavior.StrategiesFactory;
import com.amaya.game.entities.modifiers.Mandate;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.math.Vector2;
/** Abstract dropped item on the game field. */
public abstract class Drop
extends StrategyObject
implements IOwnTrajectory {
/* [ CONSTANTS ] ========================================================================================================================================= */
/** Logging tag. */
public static final String TAG = Spacefish.LOG_TAG;
/** Minimalistic speed of drop entity. */
public static final float MIN_SPEED = 0.1f;
/** Max allowed speed of drop entity. */
public static final float MAX_SPEED = 0.9f;
/** Dummy offset for game object, outside the game screen. */
public static final float DUMMY_OFFSET = -1000.0f;
/* [ MEMBERS ] =========================================================================================================================================== */
/** Command/Modifier applied on collision. */
protected final Mandate mModifier;
/** Start point of the trajectory */
protected final Vector2 mStart = new Vector2(0, 0);
/** End point of the trajectory */
protected final Vector2 mEnd = new Vector2(0, 0);
/* [ CONSTRUCTORS ] ====================================================================================================================================== */
/** Create game field entity that we can 'drop' on field with custom Modifier and custom Strategy. */
protected Drop(final Mandate modifier, final IStrategy behavior) {
super(0, 0, 0, 0);
setStrategy((null == behavior) ? StrategiesFactory.WaterGravity : behavior);
mModifier = modifier;
// speed of each object is different
setSpeed(MIN_SPEED + Spacefish.randomFloat(MAX_SPEED));
}
/** Create game field entity that we can 'drop' on field with custom Modifier. */
protected Drop(final Mandate modifier) {
this(modifier, null);
}
/* [ GETTER / SETTER METHODS ] =========================================================================================================================== */
public Mandate getModifier() {
return mModifier;
}
/** Get defined for entity trajectory start point. */
public Vector2 getStart() {
return mStart;
}
/** Get defined for entity trajectory end point. */
public Vector2 getEnd() {
return mEnd;
}
/** Randomize trajectory but start from defined xOffset. */
public <T extends Drop> T randomizeTrajectory(final float xOffset) {
// define start and end points
mStart.set(xOffset, Spacefish.Dimensions.VIRTUAL_SCREEN_HEIGHT);
mEnd.set(Spacefish.randomInt(Spacefish.Dimensions.VIRTUAL_SCREEN_WIDTH), 0);
// update current position
setPosition(mStart.x, mStart.y);
if (Spacefish.Debug.MOVE_TRAJECTORY)
Gdx.app.log(TAG, "Trajectory - start: " + mStart + ", end: " + mEnd);
return (T) this;
}
}