package org.newdawn.slick.state.transition; import java.util.ArrayList; 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; import org.newdawn.slick.util.MaskUtil; /** * A transition that causes the previous state to rotate and scale down into * the new state. * * This is an enter transition * * @author kevin */ public class BlobbyTransition implements Transition { /** The renderer to use for all GL operations */ protected static SGL GL = Renderer.get(); /** The previous state */ private GameState prev; /** True if the state has finished */ private boolean finish; /** The background applied under the previous state if any */ private Color background; /** ArrayList blobs */ private ArrayList blobs = new ArrayList(); /** The time it will run for */ private int timer = 1000; /** The number of blobs to create */ private int blobCount = 10; /** * Create a new transition */ public BlobbyTransition() { } /** * Create a new transition * * @param background The background colour to draw under the previous state */ public BlobbyTransition(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 { MaskUtil.resetMask(); } /** * @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 { prev.render(container, game, g); MaskUtil.defineMask(); for (int i=0;i<blobs.size();i++) { ((Blob) blobs.get(i)).render(g); } MaskUtil.finishDefineMask(); MaskUtil.drawOnMask(); if (background != null) { Color c = g.getColor(); g.setColor(background); g.fillRect(0,0,container.getWidth(),container.getHeight()); g.setColor(c); } } /** * @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 { if (blobs.size() == 0) { for (int i=0;i<blobCount;i++) { blobs.add(new Blob(container)); } } for (int i=0;i<blobs.size();i++) { ((Blob) blobs.get(i)).update(delta); } timer -= delta; if (timer < 0) { finish = true; } } /** * A blob to show the new state * * @author kevin */ private class Blob { /** The x coordinate of the centre of this blob */ private float x; /** The y coordinate of the centre of this blob */ private float y; /** The speed at which this blob grows */ private float growSpeed; /** The radius of this blob */ private float rad; /** * Create a new blob * * @param container The container for dimensions */ public Blob(GameContainer container) { x = (float) (Math.random() * container.getWidth()); y = (float) (Math.random() * container.getWidth()); growSpeed = (float) (1f + (Math.random() * 1f)); } /** * Update the blob * * @param delta The change in time in milliseconds */ public void update(int delta) { rad += growSpeed * delta * 0.4f; } /** * Render the blob - i.e. the mask * * @param g The grphics context on which the mask should be drawn */ public void render(Graphics g) { g.fillOval(x-rad,y-rad,rad*2,rad*2); } } }