public void paint(Graphics g) { // set up the double buffering to make the game animation nice and smooth Graphics2D twoDGraph = (Graphics2D) g; // take a snap shop of the current screen and same it as an image // that is the exact same width and height as the current screen if (back == null) back = (BufferedImage) (createImage(getWidth(), getHeight())); // create a graphics reference to the back ground image // we will draw all changes on the background image Graphics graphToBack = back.createGraphics(); if (lives < 1) { ball.setXSpeed(0); ball.setYSpeed(0); paddle.setSpeed(0); graphToBack.drawString("GAME OVER", 387, 30); } else if (bricks.isEmpty()) { ball.setXSpeed(0); ball.setYSpeed(0); paddle.setSpeed(0); graphToBack.drawString("YOU WIN", 387, 30); } ball.moveAndDraw(graphToBack); paddle.draw(graphToBack); for (Block x : bricks) { x.draw(graphToBack); } graphToBack.setColor(Color.white); graphToBack.drawString(score + ":" + lives, 387, 15); if (ball.didCollide(left) || ball.didCollide(right)) { ball.setXSpeed(-ball.getXSpeed()); } if (ball.didCollide(top)) { ball.setYSpeed(-ball.getYSpeed()); } if (ball.didCollide(bottom)) { ball.draw(graphToBack, Color.white); ball.setXSpeed(2); ball.setYSpeed(2); ball.setX(400); ball.setY(500); lives--; ball.setYSpeed(-ball.getYSpeed()); } // see if the ball hits the paddle if (ball.didCollide(paddle)) ball.setYSpeed(-ball.getYSpeed()); // brick collision for (Block x : bricks) { if (x.didCollide(ball)) { score++; x.draw(graphToBack, Color.white); bricks.remove(x); if (ball.didCollideTop(x) || ball.didCollideBottom(x)) ball.setYSpeed(-ball.getYSpeed()); else ball.setXSpeed(-ball.getXSpeed()); } } // see if the paddles need to be moved graphToBack.setColor(Color.black); graphToBack.drawString(score + ":" + lives, 387, 15); if (keys[0]) paddle.moveLeftAndDraw(graphToBack); if (keys[1]) paddle.moveRightAndDraw(graphToBack); twoDGraph.drawImage(back, null, 0, 0); }