/* 
 * Copyright (c) 1999-2002, Xiaoping Jia.  
 * All Rights Reserved. 
 */

import java.awt.*;

/**
 *  The Bouncing Ball Applet
 */
public class BouncingBall
    extends java.applet.Applet implements Runnable {

  protected Color color = Color.green;
  protected int radius = 20;
  protected int x, y;
  protected int dx = -2, dy = -4;
  protected Image image;
  protected Graphics offscreen;
  protected Dimension d;

  public void init() {
    String att = getParameter("delay");
    if (att != null) {
      delay = Integer.parseInt(att);
    }
    d = getSize();
    x = d.width * 2 / 3;
    y = d.height - radius;
  }

  public void update(Graphics g) {
    // create the off-screen image buffer
    // if it is invoked the first time
    if (image == null) {
      image = createImage(d.width, d.height);
      offscreen = image.getGraphics();
    }

    // draw the background
    offscreen.setColor(Color.white);
    offscreen.fillRect(0,0,d.width,d.height);

    // adjust the position of the ball
    // reverse the direction if it touches
    // any of the four sides
    if (x < radius || x > d.width - radius) {
      dx  =  -dx;
    }
    if (y < radius || y > d.height - radius) {
      dy  =  -dy;
    }
    x += dx;
    y += dy;

    // draw the ball
    offscreen.setColor(color);
    offscreen.fillOval(x - radius, y - radius,
		       radius * 2, radius * 2);

    // copy the off-screen image to the screen
    g.drawImage(image, 0, 0, this);
  }

  public void paint(Graphics g) {
    update(g);
  }

  // The animation applet idiom
  protected Thread bouncingThread;
  protected int delay = 100;

  public void start() {
    bouncingThread = new Thread(this);
    bouncingThread.start();
  }

  public void stop() {
    bouncingThread = null;
  }

  public void run() {
    while (Thread.currentThread() == bouncingThread) {
      try {
        Thread.currentThread().sleep(delay);
      } catch (InterruptedException  e) {}
      repaint();
    }
  }

}