1  /*
  2   *  MovingObjects.java
  3   *
  4   *  Double-buffered version of MovingRectangles.java
  5   *  with boundary checking
  6   */
  7  
  8  import java.applet.*;
  9  import java.awt.*;
 10  
 11  public class MovingObjects extends Applet implements Runnable {
 12  
 13    // Instance variables:
 14    private int numObj = 3;       // number of movable objects
 15    private MovableObject object[];      // array of movable objects
 16    private Thread thread;        // a thread
 17    private Image buffer;         // image object for double buffering
 18    private Graphics gOffScreen;  // graphics object for double buffering
 19      
 20    // Override java.applet.Applet.init:
 21    public void init () {
 22      setBackground( Color.black );
 23      setForeground( Color.white );
 24      
 25      // Instantiate object array:
 26      object = new MovableObject[ numObj ];
 27      // Instantiate a rectangle:
 28      object[0] = new MovableRectangle( 10, 10, 100, 100 );
 29      object[0].setDelta( 2, 3 );
 30      object[0].setColor( Color.red );
 31      // Instantiate a circle:
 32      object[1] = new MovableOval( 200, 10, 100, 100 );
 33      object[1].setDelta( -3, 2 );
 34      object[1].setColor( Color.blue );
 35      // Instantiate a triangle:
 36      object[2] = new MovableTriangle( 10, 200, 100, 100 );
 37      object[2].setDelta( -2, 2 );
 38      object[2].setColor( Color.green );
 39      
 40      // Create an off-screen image for double buffering:
 41      buffer = createImage( getSize().width, getSize().height );
 42      // Get off-screen graphics context:
 43      gOffScreen = buffer.getGraphics(); 
 44    }
 45  
 46    // Override java.applet.Applet.start:
 47    public void start() {
 48      if ( thread == null ) {
 49        thread = new Thread( this );
 50        thread.start();
 51      }
 52    }
 53    
 54    // Override java.applet.Applet.stop:
 55    public void stop() {
 56      if ( thread != null ) {
 57        thread.stop();
 58        thread = null;
 59      }
 60    }
 61    
 62    // Implement java.lang.Runnable.run:
 63    public void run() {
 64      while ( thread != null ) {
 65        repaint();
 66        try {
 67          Thread.sleep(20);
 68        } catch ( InterruptedException e ) {
 69          // Do nothing   
 70        };
 71      }
 72    }
 73  
 74    // Override java.awt.Component.update:
 75    public void update( Graphics g ) {
 76      // Fill background:
 77      gOffScreen.setColor( getBackground() );
 78      gOffScreen.fillRect( 1, 1, getSize().width - 2, getSize().height - 2 );
 79      // Draw boundary:
 80      gOffScreen.setColor( getForeground() );
 81      gOffScreen.drawRect( 0, 0, getSize().width - 1, getSize().height - 1 );
 82      
 83      // Move each object after checking the boundary:
 84      for ( int i = 0; i < numObj; i++ ) {
 85        object[i].checkBoundary( getBounds() );
 86        object[i].translate();
 87      }
 88      paint( gOffScreen );
 89      
 90      // Draw the buffer in the applet window:
 91      g.drawImage( buffer, 0, 0, this );
 92    }
 93    
 94    // Override java.awt.Component.paint (this method is called
 95    // once, when the applet loads):
 96    public void paint( Graphics g ) {
 97      // Paint each object:
 98      for ( int i = 0; i < numObj; i++ ) {
 99        object[i].paint(g);
100      }
101    }
102    
103  }