package bufferedterrain; import org.newdawn.slick.AppGameContainer; import org.newdawn.slick.BasicGame; import org.newdawn.slick.Color; import org.newdawn.slick.GameContainer; import org.newdawn.slick.Graphics; import org.newdawn.slick.Input; import org.newdawn.slick.SlickException; public class Main extends BasicGame { Main() { super("Terrain Test"); } private Input input; private int[][] terrain; public MersenneTwisterFast mt; private int width = 256; private int height = 192; public static void main(String[] args) { try { AppGameContainer app = new AppGameContainer(new Main()); app.setDisplayMode(1024, 768, false); app.setFullscreen(false); app.setShowFPS(false); app.setVSync(true); app.setClearEachFrame(false); app.start(); } catch (SlickException e) { e.printStackTrace(); } } @Override public void init(GameContainer container) throws SlickException { input = container.getInput(); mt = new MersenneTwisterFast(); start(); } @Override public void update(GameContainer container, int delta) throws SlickException { if (input.isKeyPressed(Input.KEY_ESCAPE)) container.exit(); if (input.isKeyPressed(Input.KEY_F2)) start(); if (input.isMouseButtonDown(Input.MOUSE_LEFT_BUTTON)) { int mX = (int) Math.floor(input.getMouseX() / 4); int mY = (int) Math.floor(input.getMouseY() / 4); if (mX >= 1 && mX < width - 1 && mY >= 1 && mY < height - 1) { terrain[mX][mY] = -1; terrain[mX + 1][mY] = -1; terrain[mX + 1][mY + 1] = -1; terrain[mX][mY + 1] = -1; } } if (input.isMouseButtonDown(Input.MOUSE_RIGHT_BUTTON)) { int mX = (int) Math.floor(input.getMouseX() / 4); int mY = (int) Math.floor(input.getMouseY() / 4); if (mX >= 1 && mX < width - 1 && mY >= 1 && mY < height - 1) { terrain[mX][mY] = 0; terrain[mX + 1][mY] = 0; terrain[mX + 1][mY + 1] = 0; terrain[mX][mY + 1] = 0; } } for (int x = 0; x < width; x++) { for (int y = height - 2; y >= 0; y--) { if (terrain[x][y] > 0) { if (terrain[x][y+1] == 0) { terrain[x][y+1] = terrain[x][y]; terrain[x][y] = 0; } } if (mt.nextBoolean()) { if (x + 1 < width) { if (terrain[x+1][y] == 0 && terrain[x][y] > 0) { terrain[x+1][y] = terrain[x][y]; terrain[x][y] = 0; } } if (x - 1 >= 0) { if (terrain[x-1][y] == 0 && terrain[x][y] > 0) { terrain[x-1][y] = terrain[x][y]; terrain[x][y] = 0; } } } } } terrain[32 + mt.nextInt(32)-16][0] = 1; terrain[96 + mt.nextInt(32)-16][0] = 2; terrain[160 + mt.nextInt(32)-16][0] = 3; terrain[224 + mt.nextInt(32)-16][0] = 4; } public void render(GameContainer container, Graphics g) throws SlickException { g.setColor(Color.black); g.fillRect(0, 0, 1024, 768); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { if (terrain[x][y] != 0) { switch(terrain[x][y]) { case -1: { g.setColor(new Color(255, 100, 100)); break; } case 1: { g.setColor(Color.white); break; } case 2: { g.setColor(Color.orange); break; } case 3: { g.setColor(Color.blue); break; } case 4: { g.setColor(Color.red); break; } } g.fillRect(x * 4, y * 4, 4, 4); } } } } private void start() { terrain = new int[width][height]; } }