package org.newdawn.slick.state.transition;
import org.newdawn.slick.Color;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.opengl.renderer.Renderer;
import org.newdawn.slick.opengl.renderer.SGL;
import org.newdawn.slick.state.GameState;
import org.newdawn.slick.state.StateBasedGame;
/**
* Vertical split transition that causes the previous state to split vertically
* revealing the new state underneath.
*
* This state is an enter transition.
*
* @author kevin
*/
public class VerticalSplitTransition implements Transition {
/** The renderer to use for all GL operations */
protected static SGL GL = Renderer.get();
/** The previous game state */
private GameState prev;
/** The current offset */
private float offset;
/** True if the transition is finished */
private boolean finish;
/** The background to draw underneath the previous state (null for none) */
private Color background;
/**
* Create a new transition
*/
public VerticalSplitTransition() {
}
/**
* Create a new transition
*
* @param background The background colour to draw under the previous state
*/
public VerticalSplitTransition(Color background) {
this.background = background;
}
/**
* @see org.newdawn.slick.state.transition.Transition#init(org.newdawn.slick.state.GameState, org.newdawn.slick.state.GameState)
*/
public void init(GameState firstState, GameState secondState) {
prev = secondState;
}
/**
* @see org.newdawn.slick.state.transition.Transition#isComplete()
*/
public boolean isComplete() {
return finish;
}
/**
* @see org.newdawn.slick.state.transition.Transition#postRender(org.newdawn.slick.state.StateBasedGame, org.newdawn.slick.GameContainer, org.newdawn.slick.Graphics)
*/
public void postRender(StateBasedGame game, GameContainer container, Graphics g) throws SlickException {
g.translate(0, -offset);
g.setClip(0,(int)-offset,container.getWidth(),container.getHeight()/2);
if (background != null) {
Color c = g.getColor();
g.setColor(background);
g.fillRect(0,0,container.getWidth(),container.getHeight());
g.setColor(c);
}
GL.glPushMatrix();
prev.render(container, game, g);
GL.glPopMatrix();
g.clearClip();
g.resetTransform();
g.translate(0, offset);
g.setClip(0,(int)((container.getHeight()/2)+(offset)),container.getWidth(),container.getHeight()/2);
if (background != null) {
Color c = g.getColor();
g.setColor(background);
g.fillRect(0,0,container.getWidth(),container.getHeight());
g.setColor(c);
}
GL.glPushMatrix();
prev.render(container, game, g);
GL.glPopMatrix();
g.clearClip();
g.translate(0,-offset);
}
/**
* @see org.newdawn.slick.state.transition.Transition#preRender(org.newdawn.slick.state.StateBasedGame, org.newdawn.slick.GameContainer, org.newdawn.slick.Graphics)
*/
public void preRender(StateBasedGame game, GameContainer container,
Graphics g) throws SlickException {
}
/**
* @see org.newdawn.slick.state.transition.Transition#update(org.newdawn.slick.state.StateBasedGame, org.newdawn.slick.GameContainer, int)
*/
public void update(StateBasedGame game, GameContainer container, int delta)
throws SlickException {
offset += delta * 1f;
if (offset > container.getHeight() / 2) {
finish = true;
}
}
}