145 lines
3.4 KiB
Java
145 lines
3.4 KiB
Java
|
|
package ei.engine;
|
||
|
|
|
||
|
|
import org.lwjgl.Sys;
|
||
|
|
import org.lwjgl.input.Keyboard;
|
||
|
|
import org.lwjgl.input.Mouse;
|
||
|
|
import org.lwjgl.opengl.Display;
|
||
|
|
import org.lwjgl.opengl.DisplayMode;
|
||
|
|
import org.lwjgl.opengl.GL11;
|
||
|
|
|
||
|
|
public class LWJGLGameWindow {
|
||
|
|
private boolean exit = false;
|
||
|
|
private int width;
|
||
|
|
private int height;
|
||
|
|
private int fps;
|
||
|
|
private boolean fullscreen;
|
||
|
|
private String title;
|
||
|
|
|
||
|
|
public LWJGLGameWindow(String title){
|
||
|
|
this(800, 600, 60, false, title);
|
||
|
|
}
|
||
|
|
|
||
|
|
public LWJGLGameWindow(int width, int height, int fps, boolean fullscreen, String title){
|
||
|
|
this.width = width;
|
||
|
|
this.height = height;
|
||
|
|
this.fps = fps;
|
||
|
|
this.fullscreen = fullscreen;
|
||
|
|
this.title = title;
|
||
|
|
|
||
|
|
try {
|
||
|
|
initDisplay();
|
||
|
|
run();
|
||
|
|
} catch (Exception e) {
|
||
|
|
e.printStackTrace(System.err);
|
||
|
|
Sys.alert(title, "An error occured and the game will exit.");
|
||
|
|
} finally {
|
||
|
|
cleanup();
|
||
|
|
}
|
||
|
|
System.exit(0);
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Initialise the game
|
||
|
|
* @throws Exception if init fails
|
||
|
|
*/
|
||
|
|
private void initDisplay() throws Exception {
|
||
|
|
DisplayMode dm = new DisplayMode(width, height);
|
||
|
|
Display.setDisplayMode(dm);
|
||
|
|
|
||
|
|
Display.setTitle(title);
|
||
|
|
Display.setFullscreen(fullscreen);
|
||
|
|
|
||
|
|
// grab the mouse, dont want that hideous cursor when we're playing!
|
||
|
|
Mouse.setGrabbed(true);
|
||
|
|
|
||
|
|
// enable textures since we're going to use these for our sprites
|
||
|
|
GL11.glEnable(GL11.GL_TEXTURE_2D);
|
||
|
|
|
||
|
|
// disable the OpenGL depth test since we're rendering 2D graphics
|
||
|
|
GL11.glDisable(GL11.GL_DEPTH_TEST);
|
||
|
|
GL11.glMatrixMode(GL11.GL_PROJECTION);
|
||
|
|
GL11.glLoadIdentity();
|
||
|
|
|
||
|
|
// Enable vsync if we can (due to how OpenGL works, it cannot be guarenteed to always work)
|
||
|
|
Display.setVSyncEnabled(true);
|
||
|
|
|
||
|
|
// Create the display window
|
||
|
|
Display.create();
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Runs the game (the "main loop")
|
||
|
|
*/
|
||
|
|
private void run() {
|
||
|
|
while (!exit) {
|
||
|
|
// Always call Window.update(), all the time - it does some behind the
|
||
|
|
// scenes work, and also displays the rendered output
|
||
|
|
Display.update();
|
||
|
|
|
||
|
|
// Check for close requests
|
||
|
|
if (Display.isCloseRequested()) {
|
||
|
|
exit = true;
|
||
|
|
}
|
||
|
|
|
||
|
|
// The window is in the foreground, so we should play the game
|
||
|
|
else if (Display.isActive()) {
|
||
|
|
update();
|
||
|
|
mainRender();
|
||
|
|
Display.sync(fps);
|
||
|
|
}
|
||
|
|
|
||
|
|
// The window is not in the foreground, so we can allow other stuff to run and
|
||
|
|
// infrequently update
|
||
|
|
else {
|
||
|
|
try {
|
||
|
|
Thread.sleep(100);
|
||
|
|
} catch (InterruptedException e) {}
|
||
|
|
update();
|
||
|
|
|
||
|
|
// Only bother rendering if the window is visible or dirty
|
||
|
|
if (Display.isVisible() || Display.isDirty()) {
|
||
|
|
mainRender();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Do any game-specific cleanup
|
||
|
|
*/
|
||
|
|
protected void cleanup() {
|
||
|
|
// Close the window
|
||
|
|
Display.destroy();
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Do all calculations, handle input, etc.
|
||
|
|
*/
|
||
|
|
protected void update() {
|
||
|
|
// Example input handler: we'll check for the ESC key and finish the game instantly when it's pressed
|
||
|
|
if (Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)) {
|
||
|
|
exit = true;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Render the current frame
|
||
|
|
*/
|
||
|
|
private void mainRender() {
|
||
|
|
// clear the screen
|
||
|
|
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
|
||
|
|
GL11.glMatrixMode(GL11.GL_MODELVIEW);
|
||
|
|
GL11.glLoadIdentity();
|
||
|
|
|
||
|
|
render();
|
||
|
|
|
||
|
|
Display.update();
|
||
|
|
}
|
||
|
|
|
||
|
|
protected void render(){
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|