package com.arretadogames.pilot.entities.effects;
import android.graphics.Color;
import android.graphics.RectF;
import com.arretadogames.pilot.entities.LayerEntity;
import com.arretadogames.pilot.render.AnimationManager;
import com.arretadogames.pilot.render.AnimationSwitcher;
import com.arretadogames.pilot.render.PhysicsRect;
import com.arretadogames.pilot.render.Renderable;
import com.arretadogames.pilot.render.opengl.GLCanvas;
import com.arretadogames.pilot.util.Util;
import org.jbox2d.common.Vec2;
public class Effect implements Renderable, LayerEntity {
private final float REMAINING_SECONDS_TO_START_FADE = 0.5f;
private AnimationSwitcher animation;
private float totalTimeElapsed;
private float alpha;
private Vec2 position;
private float angle;
private int color = 0;
// private String type;
private RectF rect;
private PhysicsRect pRect;
private int layerPosition = 0;
private float xOffset, yOffset;
private float duration;
private float animationVelocityMultiplier = 1;
private boolean repeat = true;
private PostEffectCallback callback;
protected Effect() {
}
public void setDescriptor(EffectDescriptor descriptor) {
repeat = descriptor.repeat;
animationVelocityMultiplier = descriptor.animationVelocityMultiplier;
duration = descriptor.duration;
xOffset = descriptor.xOffset;
yOffset = descriptor.yOffset;
layerPosition = descriptor.layerPosition;
pRect = descriptor.pRect;
rect = descriptor.rect;
color = descriptor.color;
position = descriptor.position;
callback = descriptor.callback;
angle = descriptor.angle;
animation = AnimationManager.getInstance().getSprite(descriptor.type);
totalTimeElapsed = 0;
animation.setRepeatableForAnimations(repeat);
animation.setAnimationRateMultiplier(animationVelocityMultiplier);
alpha = descriptor.alpha;
if (duration <= 0) {
duration = animation.getDuration();
}
}
public void resetProperties() {
/* Release Memory */
animation = null;
callback = null;
position = null;
rect = null;
pRect = null;
angle = 0;
}
public void setAnimation(AnimationSwitcher animation) {
this.animation = animation;
}
@Override
public int getLayerPosition() {
return layerPosition;
}
@Override
public void render(GLCanvas canvas, float timeElapsed) {
if (duration > 0 && totalTimeElapsed < duration ||
duration <= 0) {
canvas.saveState();
if (duration - totalTimeElapsed <= REMAINING_SECONDS_TO_START_FADE) {
alpha = ( duration - totalTimeElapsed ) / REMAINING_SECONDS_TO_START_FADE;
}
if (color != 0) {
canvas.setColor(Util.adjustColorAlpha(color, alpha));
} else {
canvas.setColor(Util.adjustColorAlpha(Color.WHITE, alpha));
}
if (rect == null) {
canvas.translatePhysics(position.x + xOffset, position.y + yOffset);
canvas.rotate(angle);
animation.render(canvas, pRect, timeElapsed);
} else {
canvas.translate(position.x + xOffset, position.y + yOffset);
canvas.rotate(angle);
animation.render(canvas, rect, timeElapsed);
}
// if (color != 0) {
canvas.resetColor();
// }
canvas.restoreState();
totalTimeElapsed += timeElapsed;
}
}
public boolean isFinished() {
if (duration > 0 && totalTimeElapsed >= duration) {
return true;
}
return false;
}
public PostEffectCallback getCallback() {
return callback;
}
}