Hi,
I am using the game loop in the tutorial basic game, which uses BufferStrategy, but when I render my world I still get flicker.
If any one could help I would appreciate it. Loop source code:
public class Planetoids implements Runnable {
public static int xOffs = 0, yOffs = 0;
public final int WIDTH = 800;
public final int HEIGHT = 600;
private PlanetEarth earth;
private JFrame frame;
private Canvas canvas;
private BufferStrategy bufferStrategy;
public Planetoids() {
frame = new JFrame("Planetoids Pre-Alpha 0.0.1");
JPanel panel = (JPanel) frame.getContentPane();
panel.setPreferredSize(new Dimension(WIDTH, HEIGHT));
panel.setLayout(null);
canvas = new Canvas();
canvas.setBounds(0, 0, WIDTH, HEIGHT);
canvas.setIgnoreRepaint(true);
panel.add(canvas);
canvas.addKeyListener(new InputManager());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setResizable(false);
frame.setVisible(true);
frame.setLocationRelativeTo(null);
canvas.createBufferStrategy(2);
bufferStrategy = canvas.getBufferStrategy();
canvas.requestFocus();
init();
}
private void init() {
earth = new PlanetEarth(30,30);
earth.map = PlanetGenerator.loadMap(30, 30);
}
long desiredFPS = 60;
long desiredDeltaLoop = (1000 * 1000 * 1000) / desiredFPS;
boolean running = true;
public void run() {
long beginLoopTime;
long endLoopTime;
long currentUpdateTime = System.nanoTime();
long lastUpdateTime;
long deltaLoop;
while (running) {
beginLoopTime = System.nanoTime();
render();
lastUpdateTime = currentUpdateTime;
currentUpdateTime = System.nanoTime();
update((int) ((currentUpdateTime - lastUpdateTime) / (1000 * 1000)));
endLoopTime = System.nanoTime();
deltaLoop = endLoopTime - beginLoopTime;
if (deltaLoop > desiredDeltaLoop) {
// Do nothing. We are already late.
} else {
try {
Thread.sleep((desiredDeltaLoop - deltaLoop) / (1000 * 1000));
} catch (InterruptedException e) {
// Do nothing
}
}
}
}
private void render() {
Graphics g = bufferStrategy.getDrawGraphics();
g.clearRect(0, 0, WIDTH, HEIGHT);
render(g);
g.dispose();
bufferStrategy.show();
}
protected void update(int deltaTime) {
}
protected void render(Graphics g) {
earth.render(g);
}
public static void main(String[] args) {
Planetoids ex = new Planetoids();
new Thread(ex).start();
}
}
The world render code:
public void render(Graphics g) {
super.render(g);
int x = 0, y = 0;
for (int i = 0; i < map.length; i++) {
if (x == width) {
x = 0;
y += 1;
}
switch (map[i]) {
case Tile.TILE_EARTH_DIRT:
g.drawImage(Tile.TILE_EARTH_DIRT_IMG, x * 32 + Planetoids.xOffs, y * 32 + Planetoids.yOffs, 32, 32, null);
break;
case Tile.TILE_EARTH_GRASS:
g.drawImage(Tile.TILE_EARTH_GRASS_IMG, x * 32 + Planetoids.xOffs, y * 32 + Planetoids.yOffs, 32, 32, null);
break;
case Tile.TILE_EARTH_STONE:
g.drawImage(Tile.TILE_EARTH_STONE_IMG, x * 32 + Planetoids.xOffs, y * 32 + Planetoids.yOffs, 32, 32, null);
break;
case Tile.TILE_EARTH_SAND:
g.drawImage(Tile.TILE_EARTH_SAND_IMG, x * 32 + Planetoids.xOffs, y * 32 + Planetoids.yOffs, 32, 32, null);
break;
}
x++;
}
}
Max