123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- package eu.tankernn.gameoflife;
- import org.lwjgl.LWJGLException;
- 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;
- import eu.tankernn.gameEngine.util.NativesExporter;
- public class GameOfLife {
- private static long lastFrameTime;
- private static float delta;
- private static boolean justPressed;
- private static boolean[][] cells;
- private static int gridWidth = 50, gridHeight = 50;
- private static int displayWidth = 800, displayHeight = 600;
- private static int cellWidth = displayWidth / gridWidth, cellHeight = displayHeight / gridHeight;
- private static boolean paused = false;
- private static boolean enableGrid = true;
- private static boolean debug = true;
- private static void initDisplay() {
- NativesExporter.exportNatives();
- try {
- Display.setDisplayMode(new DisplayMode(displayWidth, displayHeight));
- Display.create();
- } catch (LWJGLException e) {
- e.printStackTrace();
- System.exit(1);
- }
- // init OpenGL
- GL11.glMatrixMode(GL11.GL_PROJECTION);
- GL11.glLoadIdentity();
- GL11.glOrtho(0, displayWidth, 0, displayHeight, 1, -1);
- GL11.glMatrixMode(GL11.GL_MODELVIEW);
- }
- public static void main(String[] args) {
- initDisplay();
- cells = new boolean[gridWidth][gridHeight];
- while (!Display.isCloseRequested()) {
- long currentFrameTime = getCurrentTime();
- delta += (currentFrameTime - lastFrameTime) / 1000f;
- lastFrameTime = currentFrameTime;
- if (!paused && delta > 0.01f) {
- cells = update();
- delta = 0;
- }
- processInput();
- dumpCells();
- Display.update();
- }
- Display.destroy();
- }
- private static void processInput() {
- if (Mouse.isButtonDown(0) || Mouse.isButtonDown(1)) {
- int x, y;
- x = (Mouse.getX()) / cellWidth;
- y = (Mouse.getY()) / cellHeight;
- if (debug)
- System.out.println("X: " + x + ", Y: " + y);
- cells[x][y] = Mouse.isButtonDown(0);
- }
- if (Keyboard.isKeyDown(Keyboard.KEY_P)) {
- if (!justPressed)
- paused = !paused;
- justPressed = true;
- } else if (Keyboard.isKeyDown(Keyboard.KEY_C)) {
- if (!justPressed)
- cells = new boolean[gridWidth][gridHeight];
- justPressed = true;
- } else if (Keyboard.isKeyDown(Keyboard.KEY_G)) {
- if (!justPressed)
- enableGrid = !enableGrid;
- justPressed = true;
- } else {
- justPressed = false;
- }
- }
- private static void dumpCells() {
- // Clear the screen and depth buffer
- GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
- // set the color of the quads (R,G,B,A)
- GL11.glColor3f(0.0f, 1.0f, 0.0f);
- for (int y = 0; y < cells[0].length; y++) {
- for (int x = 0; x < cells.length; x++) {
- if (debug)
- System.out.print(cells[x][y] ? "X" : "-");
- if (cells[x][y]) {
- // draw quad
- GL11.glBegin(GL11.GL_QUADS);
- GL11.glVertex2f(cellWidth * x, cellHeight * y);
- GL11.glVertex2f(cellWidth * x + cellWidth, cellHeight * y);
- GL11.glVertex2f(cellWidth * x + cellWidth, cellHeight * y + cellHeight);
- GL11.glVertex2f(cellWidth * x, cellHeight * y + cellHeight);
- GL11.glEnd();
- }
- }
- if (debug)
- System.out.println();
- }
- if (enableGrid) {
- // set the color of the lines (R,G,B,A)
- GL11.glColor3f(1.0f, 1.0f, 1.0f);
- for (int y = 0; y <= gridHeight; y++) {
- GL11.glBegin(GL11.GL_LINES);
- GL11.glVertex2f(0, cellHeight * y);
- GL11.glVertex2f(displayWidth, cellHeight * y);
- GL11.glEnd();
- }
- for (int x = 0; x <= gridWidth; x++) {
- GL11.glBegin(GL11.GL_LINES);
- GL11.glVertex2f(cellWidth * x, 0);
- GL11.glVertex2f(cellWidth * x, displayHeight);
- GL11.glEnd();
- }
- }
- if (debug)
- System.out.println();
- }
- private static boolean[][] update() {
- boolean[][] newcells = new boolean[gridWidth][gridHeight];
- for (int x = 0; x < cells.length; x++)
- for (int y = 0; y < cells[0].length; y++) {
- int neighbours = 0;
- try {
- if (cells[x][y + 1])
- neighbours++;
- if (cells[x][y - 1])
- neighbours++;
- if (cells[x + 1][y + 1])
- neighbours++;
- if (cells[x + 1][y - 1])
- neighbours++;
- if (cells[x - 1][y + 1])
- neighbours++;
- if (cells[x - 1][y - 1])
- neighbours++;
- if (cells[x + 1][y])
- neighbours++;
- if (cells[x - 1][y])
- neighbours++;
- } catch (ArrayIndexOutOfBoundsException ex) {
- continue;
- }
- if (cells[x][y]) {
- if (neighbours <= 1 || neighbours >= 4) {
- newcells[x][y] = false;
- } else {
- newcells[x][y] = true;
- }
- } else {
- if (neighbours == 3) {
- newcells[x][y] = true;
- } else {
- newcells[x][y] = false;
- }
- }
- }
- return newcells;
- }
- private static long getCurrentTime() {
- return Sys.getTime() * 1000 / Sys.getTimerResolution();
- }
- }
|