3: Ebenen
This tutorial shows the concept of layers inside eEngine.

WebStart eEngine Tutorial 3 - Layer
(Note that Java does not have hardware acceleration for WebStart applications, therefore some features will be very slow, e.g. alpha blending)
package de.esw.eengine.test.t3_layer;
 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.Viewport;
 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.Layer;
 import de.esw.eengine.renderable.Text;
 import de.esw.eengine.resource.Image;
 import de.esw.eengine.resource.ResourceManager;
 import de.esw.eengine.resource.codec.GifCodec;
 import de.esw.eengine.resource.codec.JpegCodec;
 import de.esw.eengine.resource.codec.PngCodec;
 /**
  * Tutorial 3 showing how layers work.
  *
  * @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 = null;
     /** Comment for keyboardDevice */
     private IInputDevice keyboardDevice;
     /** Comment for introScreen */
     private Layer introScreen = null;
     /** Comment for landscape */
     private Layer landscape = null;
     /** Comment for lxd */
     private int vx = 3;
     /** Comment for lyd */
     private int vy = 3;
     /** Comment for fpsText */
     private Text fpsText;
     /**
      * @return True on successfull init, false otherwise
      */
     private boolean init() {
         Core.getInstance().initialize(RenderPipeline.OPENGL);
         Core.getInstance().getResourceManager().registerCodec(new JpegCodec());
         Core.getInstance().getResourceManager().registerCodec(new GifCodec());
         Core.getInstance().getResourceManager().registerCodec(new PngCodec());
         try {
             // this.renderDevice = Core.instance().createRenderDevice(
             // FullscreenRenderDevice.class);
             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 keyPressed(KeyEvent evt) {
                             switch (evt.getKeyCode()) {
                             case KeyEvent.VK_S:
                                 Main.this.saveScreenshot();
                                 break;
                             case KeyEvent.VK_ESCAPE:
                                 Main.this.renderDevice.close();
                                 break;
                             }
                         }
                     });
             this.renderDevice.attachInputDevice(this.keyboardDevice);
             // Set Viewport
             ResourceManager rm = Core.getInstance().getResourceManager();
             this.introScreen = new Layer("IntroScreen", rm
                     .loadResource("data/eengine.jpg"));
             this.fpsText = new Text("FPSText", "FPS: ", 10, 580);
             this.fpsText.setColor(Color.BLUE);
             this.introScreen.addRenderable(this.fpsText);
             this.landscape = new Layer("Landscape", rm
                     .loadResource("data/terrain.jpg"));
         } catch (EEngineException e) {
             Core.getLogger().log(Level.WARNING, e.getMessage(), e);
             return false;
         }
         return true;
     }
     /**
      * Tutorials main loop
      *
      * @throws EEngineException
      *             Thrown on some engine error
      */
     private void run() throws EEngineException {
         final Timer fpsTimer = new Timer();
         float numFrames = 0;
         float blendFator = -0.005f;
         Viewport vp = this.renderDevice.getViewport();
         while (this.renderDevice.isOpen()) {
             // Blend out intro screen by 1 percent on each loop
             if (this.introScreen.getAlpha() == 0
                     || this.introScreen.getAlpha() == 1) {
                 blendFator *= -1;
             }
             this.introScreen.blend(blendFator);
             // Move viewport
             if (vp.getX() > (this.landscape.getWidth() - this.renderDevice
                     .getWidth())
                     || vp.getX() < 0) {
                 this.vx *= -1;
             }
             if (vp.getY() > (this.landscape.getHeight() - this.renderDevice
                     .getHeight())
                     || vp.getY() < 0) {
                 this.vy *= -1;
             }
             vp.move(this.vx, this.vy);
             // Render layers in world space
             if (this.renderDevice.begin()) {
                 this.renderDevice.clear(Color.BLACK);
                 this.landscape.render(vp.getX(), vp.getY());
             }
             // Render intro screen in screen space (always visible)
             if (this.renderDevice.begin(true)) {
                 this.introScreen.render();
             }
             this.renderDevice.end();
             this.renderDevice.flip();
             // Calculate FPS
             numFrames++;
             if (fpsTimer.getDeltaTime(false) > 1000) {
                 this.fpsText.setText("FPS: "
                         + Math
                                 .round(numFrames / fpsTimer.getDeltaTime()
                                         * 1000));
                 numFrames = 0;
             }
         }
     }
     /**
      *
      */
     void saveScreenshot() {
         try {
             ResourceManager rm = Core.getInstance().getResourceManager();
             Image screenShot = (Image) rm.getResource(rm
                     .createResource("layers.jpg"));
             screenShot.setImage(this.renderDevice.caputeScreen());
             screenShot.save();
             Core.getLogger().info("Written screenshot");
         } catch (Exception 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) {
         try {
             Main app = new Main();
             try {
                 if (app.init()) {
                     app.run();
                 }
             } finally {
                 app.shutdown();
             }
         } catch (EEngineException e) {
             Core.getLogger().log(Level.WARNING, e.getMessage(), e);
         }
         System.exit(0);
     }
 }