Part 1 is an example of a simple bouncing ball in a black background. Erasing the ball is simple, just use the black color to draw the ball.
If we have a nice jpeg photo to be used as the background, the above method doesn't work, because it would leave a "black hole" to the background.
The solution is simple, instead of erasing the ball, just redraw the background photo. Let's have a look at the background photo first :
This nice background is copied from the following link, special thanks to Jessica Crabtree for adding the photo to the public domain.
http://www.jessicacrabtree.com/journal1/public-domain-nature-photos
Save the above photo as background.jpg and put it to the same folder as BgBouncingBall.java
BgBouncingBall.java is a modified version of BouncingBall.java in the previous article.
/******************************************************************************
* File : BgBouncingBall.java
* Author : http://java.macteki.com/
* Description :
* Display a bouncing ball with a jpeg background.
* Required "background.jpg" in the running folder.
* Tested with : JDK 1.6
******************************************************************************/
import java.awt.image.BufferedImage;
class BgBouncingBall extends javax.swing.JPanel implements Runnable
{
// image object for double buffering
BufferedImage drawingBoard=new BufferedImage(300,300,BufferedImage.TYPE_INT_RGB);
// image object for holding the background JPEG
BufferedImage backgroundImage;
int xBall=100, yBall=100; // initial coordinates of the moving ball
int xVelocity=3; // moving 3 pixels per frame (to the right)
public BgBouncingBall() throws Exception
{
int w=drawingBoard.getWidth(this);
int h=drawingBoard.getHeight(this);
this.setPreferredSize(new java.awt.Dimension(w,h));
// read background image
String jpeg_file="background.jpg";
backgroundImage = javax.imageio.ImageIO.read(new java.io.File(jpeg_file));
// Note : the background image is bigger than the drawing board,
// it will be clipped automatically
}
// override the paint() method, we don't count on the system.
// We draw our own panel.
public void paintComponent(java.awt.Graphics gr)
{
// Redraw the whole image instead of redrawing every object in the screen.
// This technique is commonly known as "double buffering"
gr.drawImage(drawingBoard,0,0,this);
}
// start the bouncing thread
public void start()
{
new Thread(this).start();
}
// thread entry point
public void run()
{
try
{
while (true)
{
moveBall(); // move the ball to a new position
repaint(); // redraw the panel.
Thread.sleep(30); // delay and let the user see the ball.
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
public void moveBall()
{
// Double Buffering Technique :
// Erase and redraw everything in a image object
// instead of directly drawing to the screen.
java.awt.Graphics2D gr=(java.awt.Graphics2D) drawingBoard.getGraphics();
// redraw the background image.
// this effectively erase all sprites.
gr.drawImage(backgroundImage,0,0,this);
// update ball position
int diameter=10; // diameter of the ball
xBall+=xVelocity;
if (xBall>=300-diameter || xBall<0) // hit border
{
xBall-=xVelocity; // undo movement
xVelocity=-xVelocity; // change direction of velocity
}
// draw ball at new position
gr.setColor(java.awt.Color.RED); // this is the ball color
java.awt.geom.Ellipse2D newCircle=
new java.awt.geom.Ellipse2D.Double(xBall,yBall,diameter,diameter);
gr.fill(newCircle);
}
public static void main(String[] args) throws Exception
{
javax.swing.JFrame window = new javax.swing.JFrame();
window.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
window.setTitle("Macteki bouncing ball");
BgBouncingBall ball=new BgBouncingBall();
window.add(ball);
window.pack();
window.setVisible(true);
ball.start();
}
}
Part 2 completed. To be continued...

No comments:
Post a Comment