/*
* Copyright (c) 2004 Covalent Software Ltd
* All rights reserved.
*/
package net.puppygames.applet.effects;
import net.puppygames.applet.Game;
import net.puppygames.applet.TickableObject;
import org.lwjgl.util.Color;
import org.lwjgl.util.ReadableColor;
import com.shavenpuppy.jglib.interpolators.ColorInterpolator;
import com.shavenpuppy.jglib.interpolators.LinearInterpolator;
import com.shavenpuppy.jglib.opengl.GLRenderable;
import com.shavenpuppy.jglib.resources.ColorSequenceWrapper;
import static org.lwjgl.opengl.GL11.*;
/**
* $Id: StrobeEffect.java,v 1.3 2010/03/29 22:39:43 foo Exp $
* @version $Revision: 1.3 $
* @author $Author: foo $
*/
public class StrobeEffect extends Effect {
/** Single instance */
private static StrobeEffect instance;
/** Cached color */
private final Color cachedColor = new Color();
/** Color */
private ReadableColor color, finalColor;
/** .. or color sequence */
private ColorSequenceWrapper sequence;
/** Duration */
private int duration;
/** Tick */
private int tick;
/** Tickable object */
private TickableObject tickableObject;
/**
* Private c'tor
*/
private StrobeEffect() {
if (instance != null) {
instance.remove();
instance = this;
}
}
/**
* C'tor
*/
public StrobeEffect(ReadableColor color, int duration) {
this();
this.color = color;
this.finalColor = new Color(color.getRed(), color.getGreen(), color.getBlue(), 0);
this.duration = duration;
}
/**
* C'tor
* @param sequence
*/
public StrobeEffect(ColorSequenceWrapper sequence) {
this();
this.sequence = sequence;
}
@Override
public boolean isActive() {
if (sequence != null) {
return !sequence.isFinished(tick);
} else {
return tick < duration;
}
}
@Override
protected void doTick() {
tick ++;
if (sequence == null) {
ColorInterpolator.interpolate(color, finalColor, (float) tick / (float) duration, LinearInterpolator.instance, cachedColor);
} else {
sequence.getColor(tick, cachedColor);
}
}
@Override
protected void doRender() {
}
@Override
protected void doSpawn() {
tickableObject = new TickableObject() {
@Override
protected void render() {
if (!isStarted()) {
return;
}
if ((tick & 4) == 0) {
glRender(new GLRenderable() {
@Override
public void render() {
glEnable(GL_BLEND);
glDisable(GL_TEXTURE_2D);
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
}
});
glColor4ub(cachedColor.getRedByte(), cachedColor.getGreenByte(), cachedColor.getBlueByte(), cachedColor.getAlphaByte());
glBegin(GL_QUADS);
glVertex2f(0, 0);
glVertex2f(Game.getWidth(), 0);
glVertex2f(Game.getWidth(), Game.getHeight());
glVertex2f(0, Game.getHeight());
glEnd();
}
}
};
tickableObject.spawn(getScreen());
tickableObject.setLayer(Integer.MAX_VALUE);
}
@Override
protected void doRemove() {
if (tickableObject != null) {
tickableObject.remove();
tickableObject = null;
}
instance = null;
}
@Override
public boolean isBackgroundEffect() {
return false;
}
}