package org.newdawn.slick.tests; import java.io.IOException; import org.newdawn.slick.AppGameContainer; import org.newdawn.slick.BasicGame; import org.newdawn.slick.GameContainer; import org.newdawn.slick.Graphics; import org.newdawn.slick.Input; import org.newdawn.slick.SlickException; import org.newdawn.slick.particles.ConfigurableEmitter; import org.newdawn.slick.particles.ParticleIO; import org.newdawn.slick.particles.ParticleSystem; /** * A test for duplicating a ConfigurableEmitter several times * @author Tommy * */ public class DuplicateEmitterTest extends BasicGame { /** the game container */ private GameContainer container; /** the particle system which contains an explosion emitter which we want to duplicate */ private ParticleSystem explosionSystem; /** The original emitter we've duplicated */ private ConfigurableEmitter explosionEmitter; /** * Create a new DuplicateEmitterTest */ public DuplicateEmitterTest() { super("DuplicateEmitterTest"); } /** * load ressources (the particle system) and create our duplicate emitters * and place them nicely on the screen * @param container The surrounding game container */ public void init(GameContainer container) throws SlickException { this.container = container; try { // load the particle system containing our explosion emitter explosionSystem = ParticleIO.loadConfiguredSystem("testdata/endlessexplosion.xml"); // get the emitter, it's the first (and only one) in this particle system explosionEmitter = (ConfigurableEmitter) explosionSystem.getEmitter(0); // set the original emitter in the middle of the screen at the top explosionEmitter.setPosition(400,100); // create 5 duplicate emitters for (int i = 0; i < 5; i++) { // a single duplicate of the first emitter is created here ConfigurableEmitter newOne = explosionEmitter.duplicate(); // we might get null as a result - protect against that if (newOne == null) throw new SlickException("Failed to duplicate explosionEmitter"); // give the new emitter a new unique name newOne.name = newOne.name + "_" + i; // place it somewhere on a row below the original emitter newOne.setPosition((i+1)* (800/6), 400); // and add it to the original particle system to get the new emitter updated and rendered explosionSystem.addEmitter(newOne); } } catch (IOException e) { throw new SlickException("Failed to load particle systems", e); } } /** * @see org.newdawn.slick.BasicGame#update(org.newdawn.slick.GameContainer, int) */ public void update(GameContainer container, int delta) throws SlickException { explosionSystem.update(delta); } /** * @see org.newdawn.slick.BasicGame#render(org.newdawn.slick.GameContainer, org.newdawn.slick.Graphics) */ public void render(GameContainer container, Graphics g) throws SlickException { explosionSystem.render(); } /** * @see org.newdawn.slick.BasicGame#keyPressed(int, char) */ public void keyPressed(int key, char c) { if (key == Input.KEY_ESCAPE) { container.exit(); } if (key == Input.KEY_K) { explosionEmitter.wrapUp(); } } /** * Entry point to our test * * @param argv The arguments to pass into the test, not used here */ public static void main(String[] argv) { try { AppGameContainer container = new AppGameContainer(new DuplicateEmitterTest()); container.setDisplayMode(800,600,false); container.start(); } catch (SlickException e) { e.printStackTrace(); } } }