package audioProject.entities;
import static java.lang.Math.cos;
import static java.lang.Math.sin;
import java.awt.Color;
import java.awt.Graphics2D;
import toritools.entity.Entity;
import toritools.entity.Level;
import toritools.entity.ReservedTypes;
import toritools.entity.sprite.AbstractSprite.AbstractSpriteAdapter;
import toritools.math.Vector2;
import toritools.scripting.EntityScript.EntityScriptAdapter;
import audioProject.AudioProject;
/**
* A background with controllable perspective and speed.
* @author toriscope
*
*/
public class ScrollingBackground extends Entity {
private Color color;
private float speed;
private float barAmount;
private float prespectiveRatio;
private float centerRatio;
private float topSpacing;
private float bottomSpacing;
private float verticalOffset;
public void setFocus(final Vector2 focus, final float verticalOffsetScalar) {
centerRatio = focus.x / dim.x;
verticalOffset = verticalOffsetScalar * (focus.y - dim.y / 2);
}
public ScrollingBackground(Vector2 dim, int speed, int barAmount, float prespectiveRatio, float centerRatio, int topSpacing, int bottomSpacing, final float averageSin) {
this.speed = speed;
this.barAmount = barAmount;
this.prespectiveRatio = prespectiveRatio;
this.centerRatio = centerRatio;
this.topSpacing = topSpacing;
this.bottomSpacing = bottomSpacing;
this.verticalOffset = 0;
setPos(Vector2.ZERO);
setDim(dim);
type = ReservedTypes.BACKGROUND.toString();
layer = 9;
getVariableCase().setVar("id", "bg");
setSprite(new AbstractSpriteAdapter() {
float time = 0;
float sinTimer = 0;
@Override
public void draw(Graphics2D g, Entity self) {
g.setColor(new Color(232, 243, 178));
//g.fillRect((int) position.x, (int) position.y, (int) dimension.x, (int) dimension.y);
Vector2 dimension = self.getDim();
float spacing = dimension.x / getBarAmount();
float center = (dimension.x * getCenterRatio());
float bottomSpacingLocal = getBottomSpacing();
float topSpacingLocal = getTopSpacing();
time = (time - getSpeed()) % spacing;
float feel = AudioProject.controller.getFeel();
sinTimer += averageSin * 2 * feel;
//feel *= AudioProject.controller.isBeat() ? .5f : 1;
//cycleColors();
g.setColor(AudioProject.barsColor);
// Middle
for(float i = time; i < dimension.x; i+= spacing) {
topSpacingLocal = getTopSpacing() - getTopSpacing() * (float) sin(sinTimer + i * .01 * feel);
bottomSpacingLocal = getBottomSpacing() - getBottomSpacing() * (float) cos(sinTimer + i * .01 * feel);
g.drawLine((int) i,(int) (topSpacingLocal - verticalOffset), (int) i, (int) (dimension.y - bottomSpacingLocal - verticalOffset));
}
// Top
for(float i = time; i < dimension.x; i+= spacing) {
topSpacingLocal = getTopSpacing() - getTopSpacing() * (float) sin(sinTimer + i * .01 * feel);
bottomSpacingLocal = getBottomSpacing() - getBottomSpacing() * (float) cos(sinTimer + i * .01 * feel);
g.drawLine((int) i, (int) (topSpacingLocal - verticalOffset), (int) (center - (center - i) * getPrespectiveRatio()), 0);
}
//g.setColor(AudioProject.barsDarkerColor);
// Bottom
for(float i = time; i < dimension.x; i+= spacing) {
topSpacingLocal = getTopSpacing() - getTopSpacing() * (float) sin(sinTimer + i * .01 * feel);
bottomSpacingLocal = getBottomSpacing() - getBottomSpacing() * (float) cos(sinTimer + i * .01 * feel);
g.drawLine((int) i, (int) (dimension.y - bottomSpacingLocal - verticalOffset), (int) (center - (center - i) * getPrespectiveRatio()), (int) dimension.y);
}
}
});
addScript(new EntityScriptAdapter() {
@Override
public void onUpdate(Entity self, float time, Level level) {
}
});
}
public void setColor( Color c) {
color = c;
}
public Color getColor() {
return color;
}
public float getSpeed() {
return speed;
}
public void setSpeed(float speed) {
this.speed = speed;
}
public float getBarAmount() {
return barAmount;
}
public void setBarAmount(float barAmount) {
this.barAmount = barAmount;
}
public float getPrespectiveRatio() {
return prespectiveRatio;
}
public void setPrespectiveRatio(float prespectiveRatio) {
this.prespectiveRatio = prespectiveRatio;
}
public float getCenterRatio() {
return centerRatio;
}
public void setCenterRatio(float centerRatio) {
this.centerRatio = centerRatio;
}
public float getTopSpacing() {
return topSpacing;
}
public void setTopSpacing(float topSpacing) {
this.topSpacing = topSpacing;
}
public float getBottomSpacing() {
return bottomSpacing;
}
public void setBottomSpacing(int bottomSpacing) {
this.bottomSpacing = bottomSpacing;
}
public float getVerticalOffset() {
return verticalOffset;
}
public void setVerticalOffset(float verticalOffset) {
this.verticalOffset = verticalOffset;
}
}