Thanks. I created a simple class for drawing background (terrain) from ahristov’s tutorial and put it on BufferedImage gives a better performance
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.geom.GeneralPath;
import java.awt.image.BufferedImage;
import java.awt.BasicStroke;
import java.util.Random;
public class Background{
private static final int WIDTH = 800;
private static final int HEIGHT = 600;
private BufferedImage bi;
public Background(){
bi = new BufferedImage(WIDTH,HEIGHT,1);
drawTerrain(bi.createGraphics());
}
private void drawTerrain(Graphics2D g){
g.setColor(Color.white);
g.fillRect(0,0,WIDTH,HEIGHT);
Random rnd = new Random();
float baseH = 190/360f;
float baseS = 245/255f;
float baseB = 233/255f;
int MIN_Y = 50; //Y
int MAX_Y = HEIGHT;
int MIN_X = 0;
int MAX_X = WIDTH;
int LAYERS = 8;
float BRIGHTNESS_STEP=163/255f/15;
for (int y = MIN_Y; y<=MAX_Y; y+=(MAX_Y-MIN_Y)/LAYERS) {
g.setColor(Color.getHSBColor(baseH,baseS,baseB));
GeneralPath gp = new GeneralPath();
gp.moveTo(MIN_X,MAX_Y);
gp.lineTo(MIN_X,y);
int x = 0;
for (int i = 1; x < WIDTH; i++) {
int deltaY = rnd.nextInt(150)-75;
int deltaX = rnd.nextInt(200)+50;
gp.quadTo(x+deltaX/2,y+deltaY,x+deltaX,y);
x+=deltaX;
}
gp.lineTo(MAX_X,MAX_Y);
g.fill(gp);
g.setStroke(new BasicStroke(7));
g.setColor(Color.getHSBColor(baseH,baseS,baseB+BRIGHTNESS_STEP*3/2));
g.draw(gp);
baseB -= BRIGHTNESS_STEP;
}
}
public void draw(Graphics2D g){
g.drawImage(bi,0,0,null);
}
}
Honestly it’s my first time to meet GeneralPath class and it’s quite useful. Some background can be created from this I think 