4: SceneGraph + Sprites
This tutorial shows the use of sprites and the SceneGraph inside eEngine.

WebStart eEngine Tutorial 4 - Sprites
package de.esw.eengine.test.t4_sprites;
 import java.awt.Color;
 import java.awt.DisplayMode;
 import java.awt.event.KeyEvent;
 import java.util.logging.Level;
 import de.esw.eengine.EEngineException;
 import de.esw.eengine.core.Core;
 import de.esw.eengine.core.IInputDevice;
 import de.esw.eengine.core.IRenderDevice;
 import de.esw.eengine.core.Timer;
 import de.esw.eengine.core.Core.RenderPipeline;
 import de.esw.eengine.device.input.AbstractKeyboardListener;
 import de.esw.eengine.device.input.KeyboardInputDevice;
 import de.esw.eengine.device.input.SystemInputDevice;
 import de.esw.eengine.device.render.WindowRenderDevice;
 import de.esw.eengine.renderable.BoundingVolume;
 import de.esw.eengine.renderable.SceneNode;
 import de.esw.eengine.renderable.Sprite;
 import de.esw.eengine.renderable.Text;
 import de.esw.eengine.resource.codec.GifCodec;
 import de.esw.eengine.resource.codec.JpegCodec;
 import de.esw.eengine.resource.codec.PngCodec;
 /**
  * Tutorial 4 showing the work of sprites.
  *
  * @author markusw
  * @version $Id: Main.java 168 2005-07-07 18:43:57Z markusw $
  * @since 1.0
  */
 public final class Main {
     /** Comment for renderDevice */
     IRenderDevice renderDevice;
     /** Comment for keyboardDevice */
     private IInputDevice keyboardDevice;
     /** Comment for timer */
     private Timer timer;
     /** Comment for fpsTimer */
     private Timer fpsTimer;
     /** Comment for fps */
     private int fps;
     /** Comment for numFrames */
     private float numFrames;
     /** Comment for NUM_ECHELON */
     private static final int NUM_ECHELON = 20;
     /** Comment for echelon */
     private SceneNode[] echelon;
     /**
      * @author markusw
      * @version $Id: Main.java 168 2005-07-07 18:43:57Z markusw $
      * @since 1.0
      */
     public class Echelon extends SceneNode {
         /**
          * @param imageResource
          * @throws EEngineException
          */
         public Echelon(int imageResource) throws EEngineException {
             super("Echelon");
             this.setLocation((int) (Math.random() * 700),
                     (int) (Math.random() * 500));
             // Create echelon
             for (int i = 0; i < 3; i++) {
                 // Create sprite
                 Sprite fighter = new Sprite("FighterEntity" + i, imageResource);
                 fighter.setScale(0.25f, 0.25f);
                 fighter.setLocation((i - 1) * fighter.getWidth(), Math
                         .abs((i - 1) * -25));
                 new SceneNode("FighterNode" + i, this, fighter, 0, 0);
             }
             this.setVelocity(0.1f, 0.1f);
         }
         /**
          * @see de.esw.eengine.renderable.SceneNode#update(float)
          */
         @Override
         public void update(float delta) {
             super.update(delta);
             final BoundingVolume bv = this.getBoundingVolume();
             if ((bv.getLeft() <= 0 && this.vx < 0)
                     || (bv.getRight() >= 800 && this.vx > 0)) {
                 this.vx = -this.vx;
             }
             if ((bv.getTop() <= 0 && this.vy < 0)
                     || (bv.getBottom() >= 600 && this.vy > 0)) {
                 this.vy = -this.vy;
             }
         }
         /**
          * @see de.esw.eengine.renderable.SceneNode#render()
          */
         @Override
         public void render() {
             super.render();
             this.boundingVolume.render();
         }
     }
     /**
      * @return True on successfull init, false otherwise
      */
     private boolean init() {
         Core.getInstance().initialize(RenderPipeline.DIRECT3D);
         Core.getInstance().getResourceManager().registerCodec(new JpegCodec());
         Core.getInstance().getResourceManager().registerCodec(new GifCodec());
         Core.getInstance().getResourceManager().registerCodec(new PngCodec());
         this.timer = new Timer();
         this.fpsTimer = new Timer();
         this.fps = 0;
         this.numFrames = 0;
         try {
             this.renderDevice = Core.getInstance().createRenderDevice(
                     WindowRenderDevice.class);
             this.renderDevice.open(new DisplayMode(800, 600, 16,
                     DisplayMode.REFRESH_RATE_UNKNOWN));
             // Add system input device
             new SystemInputDevice(this.renderDevice);
             // Add keyboard input
             this.keyboardDevice = Core.getInstance().createInputDevice(
                     KeyboardInputDevice.class);
             this.keyboardDevice
                     .addInputListener(new AbstractKeyboardListener() {
                         @Override
                         public void keyTyped(KeyEvent e) {
                             if (e.getKeyChar() == KeyEvent.VK_ESCAPE) {
                                 Main.this.renderDevice.close();
                             }
                         }
                     });
             this.renderDevice.attachInputDevice(this.keyboardDevice);
             // Load sprites
             int spriteImage = Core.getInstance().getResourceManager()
                     .loadResource("data/spacefighter.png");
             // Create echelons
             this.echelon = new SceneNode[NUM_ECHELON];
             for (int i = 0; i < NUM_ECHELON; i++) {
                 this.echelon[i] = new Echelon(spriteImage);
             }
         } catch (EEngineException e) {
             Core.getLogger().log(Level.WARNING, e.getMessage(), e);
             return false;
         }
         return true;
     }
     /**
      * Tutorials main loop
      */
     private void run() {
         try {
             Text fpsText = new Text("FPSText", "FPS: " + this.fps, 10, 580);
             fpsText.setColor(Color.GREEN);
             while (this.renderDevice.isOpen()) {
                 // Update sprites
                 long updateTime = this.timer.getDeltaTime();
                 for (int i = 0; i < NUM_ECHELON; i++) {
                     this.echelon[i].update(updateTime);
                 }
                 // Render sprites
                 if (this.renderDevice.begin()) {
                     this.renderDevice.clear(Color.BLACK);
                     for (int i = 0; i < NUM_ECHELON; i++) {
                         this.echelon[i].render();
                         // this.echelon[i].getBoundingVolume().render();
                         fpsText.render();
                     }
                 }
                 this.renderDevice.end();
                 this.renderDevice.flip();
                 // Calculate FPS
                 this.numFrames++;
                 if (this.fpsTimer.getDeltaTime(false) > 1000) {
                     this.fps = Math.round(this.numFrames
                             / this.fpsTimer.getDeltaTime() * 1000);
                     this.numFrames = 0;
                     fpsText.setText("FPS: " + this.fps);
                 }
             }
         } catch (EEngineException e) {
             Core.getLogger().log(Level.WARNING, e.getMessage(), e);
         }
     }
     /**
      *
      */
     private void shutdown() {
         this.renderDevice.close();
         Core.getInstance().shutdown();
     }
     /**
      * @param args
      */
     public static void main(String[] args) {
         Main app = new Main();
         try {
             if (app.init()) {
                 app.run();
             }
         } finally {
             app.shutdown();
         }
         System.exit(0);
     }
 }