package stray.transition; import stray.Main; import stray.Settings; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.math.MathUtils; public class Eat implements Transition { public Eat(int placements, int speed) { if (speed <= 0) throw new IllegalArgumentException( "Speed value must be greater than 0 : got " + speed); this.speed = speed; sizex = (int) (Settings.DEFAULT_WIDTH / tilewidthpx) + 2; sizey = (int) (Gdx.graphics.getHeight() / tileheightpx) + 2; traversed = new boolean[sizex][sizey]; temp = new boolean[sizex][sizey]; for (int x = 0; x < sizex; x++) { for (int y = 0; y < sizey; y++) { traversed[x][y] = false; temp[x][y] = false; } } for (int i = 0; i < placements; i++) { traversed[MathUtils.random(1, sizex) - 1][MathUtils.random(1, sizey) - 1] = true; } } public Eat setColors(Color d, Color o) { dark = d; outline = o; return this; } int speed = 1; int sizex; int sizey; final float tilewidthpx = 16f; final float tileheightpx = 9f; boolean[][] traversed; boolean[][] temp; boolean useOutline = false; @Override public boolean finished() { for (int x = 0; x < sizex; x++) { for (int y = 0; y < sizey; y++) { if (traversed[x][y] == false) return false; } } return true; } Color dark = Color.BLACK; Color outline = Color.WHITE; private boolean filledAdjacent(int x, int y) { if (x > 0) { if (traversed[x - 1][y]) { return true; } } else if (x < sizex - 1) { if (traversed[x + 1][y]) { return true; } } else if (y > 0) { if (traversed[x][y - 1]) { return true; } } else if (y < sizey - 1) { if (traversed[x][y + 1]) { return true; } } return false; } @Override public void render(Main main) { main.batch.setColor(dark); for (int x = 0; x < sizex; x++) { for (int y = 0; y < sizey; y++) { if (useOutline) { if (traversed[x][y]) { main.batch.setColor(dark); main.fillRect(x * (tilewidthpx), Main.convertY(y * (tileheightpx) + (tileheightpx)), (tilewidthpx), (tileheightpx)); } else if (!traversed[x][y] && filledAdjacent(x, y)) { main.batch.setColor(outline); main.fillRect(x * (tilewidthpx), Main.convertY(y * (tileheightpx) + (tileheightpx)), (tilewidthpx), (tileheightpx)); } } else { if (traversed[x][y]) { main.fillRect(x * (tilewidthpx), Main.convertY(y * (tileheightpx) + (tileheightpx)), (tilewidthpx), (tileheightpx)); } } } } main.batch.setColor(Color.WHITE); } @Override public void tickUpdate(Main main) { for (int i = 0; i < speed; i++) { for (int x = 0; x < sizex; x++) { for (int y = 0; y < sizey; y++) { temp[x][y] = false; } } for (int x = 0; x < sizex; x++) { for (int y = 0; y < sizey; y++) { if (!temp[x][y] && traversed[x][y]) { temp[x][y] = true; if (x > 0 && !(MathUtils.random(1, 2) == 1)) { if (!traversed[x - 1][y]) { traversed[x - 1][y] = true; temp[x - 1][y] = true; } } if (x < sizex - 1 && !(MathUtils.random(1, 2) == 1)) { if (!traversed[x + 1][y]) { traversed[x + 1][y] = true; temp[x + 1][y] = true; } } if (y > 0 && !(MathUtils.random(1, 2) == 1)) { if (!traversed[x][y - 1]) { traversed[x][y - 1] = true; temp[x][y - 1] = true; } } if (y < sizey - 1 && !(MathUtils.random(1, 2) == 1)) { if (!traversed[x][y + 1]) { traversed[x][y + 1] = true; temp[x][y + 1] = true; } } } } } } } }