package loon.action.sprite.effect;
import java.util.Iterator;
import loon.LSystem;
import loon.action.sprite.Entity;
import loon.canvas.LColor;
import loon.event.LTouchArea;
import loon.opengl.GLEx;
import loon.utils.TArray;
import loon.utils.processes.RealtimeProcess;
import loon.utils.processes.RealtimeProcessManager;
import loon.utils.timer.LTimer;
import loon.utils.timer.LTimerContext;
public class RippleEffect extends Entity implements LTouchArea, BaseEffect {
public enum Model {
OVAL, RECT;
}
private TArray<RippleKernel> ripples;
private LTimer timer;
private boolean completed;
private Model model;
private int existTime = 25;
public RippleEffect() {
this(Model.OVAL, LColor.blue);
}
public RippleEffect(LColor c) {
this(Model.OVAL, c);
}
public RippleEffect(Model model) {
this(model, LColor.blue);
}
public RippleEffect(Model m, LColor c) {
model = m;
setColor(c);
ripples = new TArray<RippleKernel>();
timer = new LTimer(60);
setRepaint(true);
}
public void setDelay(long delay) {
this.timer.setDelay(delay);
}
public long getDelay() {
return this.timer.getDelay();
}
public boolean addRipplePoint(final float x, final float y) {
final RippleKernel ripple = new RippleKernel(x, y, existTime);
final RealtimeProcess update = new RealtimeProcess() {
@Override
public void run(LTimerContext time) {
RippleKernel rippleOther = new RippleKernel(x, y, existTime);
ripples.add(rippleOther);
kill();
}
};
update.setDelay(LSystem.SECOND / 5);
RealtimeProcessManager.get().addProcess(update);
ripples.add(ripple);
return true;
}
@Override
public void repaint(GLEx g, float sx, float sy) {
if (completed) {
return;
}
int tmp = g.color();
g.setColor(_baseColor);
for (Iterator<RippleKernel> it = ripples.iterator(); it.hasNext();) {
RippleKernel ripple = it.next();
ripple.draw(g, model, drawX(sx), drawY(sy));
}
g.setColor(tmp);
}
@Override
public void onUpdate(long elapsedTime) {
if (completed) {
return;
}
if (timer.action(elapsedTime)) {
for (Iterator<RippleKernel> it = ripples.iterator(); it.hasNext();) {
RippleKernel ripple = it.next();
if (ripple.isExpired()) {
it.remove();
}
}
}
}
@Override
public boolean isCompleted() {
return completed;
}
@Override
public void close() {
super.close();
completed = true;
}
public int getExistTime() {
return existTime;
}
public void setExistTime(int existTime) {
this.existTime = existTime;
}
@Override
public boolean contains(float x, float y) {
return LSystem.viewSize.contains(x, y);
}
@Override
public void onAreaTouched(Event e, float touchX, float touchY) {
if (e == Event.DOWN) {
addRipplePoint(touchX, touchY);
}
}
}