Please does anyone have an explaination of why I can create an image to be used in double buffering in the render() method. thankyou
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.image.*;
public class GamePanel extends JPanel implements Runnable
{
public static final int GAME_WIDTH = 600;
public static final int GAME_HEIGHT = 600;
public static final int LEFT_PADDLE_FROM_LEFT = 10;
public static final int RIGHT_PADDLE_FROM_RIGHT = 10;
public static final int MOVE_PADDLE_UP = 1;
public static final int MOVE_PADDLE_DOWN = 2;
public static final int NO_MOVE = 0;
private int leftPaddleMovementStatus;
private int rightPaddleMovementStatus;
private
Thread thread;
private boolean running = false;
private Ball ball;
private Paddle leftPaddle;
private Paddle rightPaddle;
//used in double duffering
private Image dbImage;
private Graphics dbg;
//used in game update to move paddles
public GamePanel()
{
this.setSize(WIDTH, HEIGHT);
setVisible(true);
//start the ball right in the center of the game
ball = new Ball(WIDTH/2 - Ball.DIAMETER/2, HEIGHT/2 - Ball.DIAMETER/2);
leftPaddle = new Paddle(LEFT_PADDLE_FROM_LEFT, GAME_HEIGHT/2 - Paddle.HEIGHT/2 );
rightPaddle = new Paddle(RIGHT_PADDLE_FROM_RIGHT, GAME_HEIGHT/2 - Paddle.HEIGHT/2);
setUpListeners();
thread = new Thread(this);
thread.start();
}
private void setUpListeners() {
setFocusable(true);
addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e){
if(e.getKeyCode() == KeyEvent.VK_UP ){
rightPaddleMovementStatus = MOVE_PADDLE_UP;
}
if(e.getKeyCode() == KeyEvent.VK_DOWN ){
rightPaddleMovementStatus = MOVE_PADDLE_DOWN;
}
if(e.getKeyCode() == KeyEvent.VK_W ){
leftPaddleMovementStatus = MOVE_PADDLE_UP;
}
if(e.getKeyCode() == KeyEvent.VK_S ){
leftPaddleMovementStatus = MOVE_PADDLE_DOWN;
}
}});
}
public void run(){
running = true;
while(running){
gameUpdate();
render();
paintToScreen();
try{
Thread.sleep(20);
}
catch(InterruptedException e){};
}
System.exit(0);
}
public void gameUpdate(){
//check that paddle does not run of screen, if safe move the paddle
if(leftPaddle.getPoint().y > 0 && leftPaddle.getPoint().y < GAME_HEIGHT - Paddle.HEIGHT){
if(leftPaddleMovementStatus == MOVE_PADDLE_UP){
leftPaddle.getPoint().y += 1;
}
if(leftPaddleMovementStatus == MOVE_PADDLE_DOWN){
leftPaddle.getPoint().y -= 1;
}
if(rightPaddleMovementStatus == MOVE_PADDLE_UP){
rightPaddle.getPoint().y += 1;
}
if(leftPaddleMovementStatus == MOVE_PADDLE_DOWN){
rightPaddle.getPoint().y -= 1;
}
//reset status for next keylisten event
leftPaddleMovementStatus = NO_MOVE;
rightPaddleMovementStatus = NO_MOVE;
}
}
public void render(){
// this returns true
System.out.println(isVisible());
// this returns false
System.out.println(GraphicsEnvironment.isHeadless());
if(dbImage == null){
dbImage = createImage(GAME_WIDTH,GAME_HEIGHT);
if(dbImage == null){
System.out.println("error in making image");
}
else{
dbg = dbImage.getGraphics();
}
}
dbg.setColor(Color.black);
dbg.fillRect(0, 0, GAME_WIDTH, GAME_HEIGHT);
dbg.setColor(Color.green);
int x = leftPaddle.getPoint().x;
int y = leftPaddle.getPoint().y;
dbg.fillRect(x, y, x + Paddle.WIDTH, y + Paddle.HEIGHT );
x = rightPaddle.getPoint().x;
y = rightPaddle.getPoint().y;
dbg.fillRect(x, y, x + Paddle.WIDTH, y + Paddle.HEIGHT );
}
public void paintToScreen(){
Graphics g = getGraphics();
g = dbg;
paintComponent(g);
}
}