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);
}
}