package chu.engine;
import static org.lwjgl.opengl.GL11.GL_ALPHA_TEST;
import static org.lwjgl.opengl.GL11.GL_BLEND;
import static org.lwjgl.opengl.GL11.GL_DEPTH_TEST;
import static org.lwjgl.opengl.GL11.GL_GREATER;
import static org.lwjgl.opengl.GL11.GL_LEQUAL;
import static org.lwjgl.opengl.GL11.GL_MODELVIEW;
import static org.lwjgl.opengl.GL11.GL_ONE_MINUS_SRC_ALPHA;
import static org.lwjgl.opengl.GL11.GL_PROJECTION;
import static org.lwjgl.opengl.GL11.GL_SMOOTH;
import static org.lwjgl.opengl.GL11.GL_SRC_ALPHA;
import static org.lwjgl.opengl.GL11.GL_TEXTURE_2D;
import static org.lwjgl.opengl.GL11.glAlphaFunc;
import static org.lwjgl.opengl.GL11.glBlendFunc;
import static org.lwjgl.opengl.GL11.glClearColor;
import static org.lwjgl.opengl.GL11.glClearDepth;
import static org.lwjgl.opengl.GL11.glDepthFunc;
import static org.lwjgl.opengl.GL11.glEnable;
import static org.lwjgl.opengl.GL11.glLoadIdentity;
import static org.lwjgl.opengl.GL11.glMatrixMode;
import static org.lwjgl.opengl.GL11.glOrtho;
import static org.lwjgl.opengl.GL11.glShadeModel;
import static org.lwjgl.opengl.GL11.glViewport;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import net.fe.network.Message;
import org.lwjgl.LWJGLException;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
public abstract class Game {
protected static int windowWidth = 640;
protected static int windowHeight = 480;
protected static int scaleX = 2;
protected static int scaleY = 2;
protected boolean paused = false;
protected static List<KeyboardEvent> keys;
protected static List<MouseEvent> mouseEvents;
protected static CopyOnWriteArrayList<Message> messages;
protected long time;
protected static long timeDelta;
protected static boolean glContextExists;
public void init(int width, int height, String name) {
time = System.nanoTime();
windowWidth = width*scaleX;
windowHeight = height*scaleY;
try {
Display.setDisplayMode(new DisplayMode(windowWidth, windowHeight));
Display.create();
Display.setTitle(name);
Keyboard.create();
Keyboard.enableRepeatEvents(true);
Mouse.create();
glContextExists = true;
} catch (LWJGLException e) {
e.printStackTrace();
System.exit(0);
}
//init OpenGL
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.01f);
glEnable(GL_TEXTURE_2D);
glShadeModel(GL_SMOOTH);
glClearDepth(1.0f);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glViewport(0, 0, windowWidth, windowHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, windowWidth/scaleX, windowHeight/scaleY, 0, 1, -1); //It's basically a camera
glMatrixMode(GL_MODELVIEW);
keys = new ArrayList<KeyboardEvent>();
mouseEvents = new ArrayList<MouseEvent>();
}
public abstract void loop();
public static void getInput() {
Keyboard.poll();
keys.clear();
while(Keyboard.next()) {
KeyboardEvent ke = new KeyboardEvent(
Keyboard.getEventKey(),
Keyboard.getEventCharacter(),
Keyboard.isRepeatEvent(),
Keyboard.getEventKeyState());
keys.add(ke);
}
Mouse.poll();
mouseEvents.clear();
while(Mouse.next()) {
MouseEvent me = new MouseEvent(
Mouse.getEventX(),
Mouse.getEventY(),
Mouse.getEventDWheel(),
Mouse.getEventButton(),
Mouse.getEventButtonState());
mouseEvents.add(me);
}
}
public static List<KeyboardEvent> getKeys() {
return keys;
}
public static List<MouseEvent> getMouseEvents() {
return mouseEvents;
}
public static List<Message> getMessages() {
return messages;
}
public static long getDelta() {
return timeDelta;
}
public static float getDeltaMillis() {
return timeDelta/1000000.0f;
}
public static float getDeltaSeconds() {
return timeDelta/1000000000.0f;
}
public static int getWindowWidth() {
return windowWidth;
}
public static int getWindowHeight() {
return windowHeight;
}
public static boolean glContextExists() {
return glContextExists;
}
public static int getScaleX() {
return scaleX;
}
public static int getScaleY() {
return scaleY;
}
}