1
0

Add gradient terrain

This commit is contained in:
Victor 2014-03-15 15:46:52 +02:00
parent ca3b8f33ae
commit 4bc466a9a6

View File

@ -1,7 +1,8 @@
package com.annimon.turrets; package com.annimon.turrets;
import java.awt.Color; import java.awt.Color;
import java.awt.Graphics; import java.awt.Graphics2D;
import java.awt.LinearGradientPaint;
import java.util.Random; import java.util.Random;
/** /**
@ -10,21 +11,25 @@ import java.util.Random;
*/ */
public class Terrain implements Constants { public class Terrain implements Constants {
private static final Color TERRAIN_COLOR = new Color(0xFF269920); private static final Color[] TERRAIN_COLOR = {
new Color(0xFF33CE2B), new Color(0xFF1C7317)
};
private static final int SMOOTH_ITERATIONS = 10; private static final int SMOOTH_ITERATIONS = 10;
private final int blocksCount; private final int blocksCount;
private final int blockSize; private final int blockSize;
private final int[] blockHeights; private final int[] blockHeights;
private LinearGradientPaint gradientPaint;
public Terrain(int blocksCount) { public Terrain(int blocksCount) {
this.blocksCount = blocksCount; this.blocksCount = blocksCount;
blockSize = WIDTH / blocksCount; blockSize = WIDTH / blocksCount;
blockHeights = new int[blocksCount]; blockHeights = new int[blocksCount];
} }
public void draw(Graphics g) { public void draw(Graphics2D g) {
g.setColor(TERRAIN_COLOR); g.setPaint(gradientPaint);
for (int i = 0; i < blocksCount; i++) { for (int i = 0; i < blocksCount; i++) {
final int blockHeight = blockHeights[i]; final int blockHeight = blockHeights[i];
g.fillRect(i * blockSize, HEIGHT - blockHeight, blockSize, blockHeight); g.fillRect(i * blockSize, HEIGHT - blockHeight, blockSize, blockHeight);
@ -65,11 +70,15 @@ public class Terrain implements Constants {
final int maxHeight = HEIGHT / 2; final int maxHeight = HEIGHT / 2;
final int stepHeight = maxHeight / 75 * blockSize; final int stepHeight = maxHeight / 75 * blockSize;
int maxBlockHeight = 0;
blockHeights[0] = rnd.nextInt(maxHeight); blockHeights[0] = rnd.nextInt(maxHeight);
for (int i = 1; i < blocksCount; i++) { for (int i = 1; i < blocksCount; i++) {
blockHeights[i] = blockHeights[i - 1] + rnd.nextInt(2 * stepHeight + 1) - stepHeight; int value = blockHeights[i - 1] + rnd.nextInt(2 * stepHeight + 1) - stepHeight;
if (blockHeights[i] > maxHeight) blockHeights[i] = maxHeight; if (value > maxHeight) value = maxHeight;
else if (blockHeights[i] < 0) blockHeights[i] = 0; else if (blockHeights[i] < 0) value = 0;
blockHeights[i] = value;
// Detect max block height
if (maxBlockHeight < value) maxBlockHeight = value;
} }
// Flatten out left and right blocks for turrets. // Flatten out left and right blocks for turrets.
for (int i = 0; i < PLAYERS_BLOCK_COUNT; i++) { for (int i = 0; i < PLAYERS_BLOCK_COUNT; i++) {
@ -83,5 +92,10 @@ public class Terrain implements Constants {
blockHeights[i] = (blockHeights[i - 1] + blockHeights[i + 1]) / 2; blockHeights[i] = (blockHeights[i - 1] + blockHeights[i + 1]) / 2;
} }
} }
gradientPaint = new LinearGradientPaint(
0, Constants.HEIGHT - maxBlockHeight,
0, Constants.HEIGHT,
new float[] {0f, 1f}, TERRAIN_COLOR);
} }
} }