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