//File: TrainApplet.java
//Uses: DrawingObjectList.java
//Uses: FlipBook.java

/* This is a simple object-list and flip-book based
   drawing of train moving along a track
   making puffs of smoke.
   
   H. J. Bernstein, 2 December 2001
   
 */
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.applet.Applet;
import DrawingObjectList;

public class TrainApplet extends Applet
{
// Global data
    DrawingObjectList dol = null;

// Initialization
  public void init() {
    dol = null;
  }


// paint method to to the actual drawing
  public void paint (Graphics g_real) {
    
    // declare variables
    Graphics g;       // a graphics object
    Dimension size    // dimensions of the window
        = getSize();
    int frame;        // the current frame
    int frames;       // the total number of frames
    int cx = size.width,
        cy = size.height,
        diameter = (int)(.8*Math.min(cx, cy));
    int ii;

     
    frames = (int)(cx*1.6);
    
    // If the DOL exists and is the right size
    // use the pages we already created.
    
    if (dol == null 
       || dol.curFrames != frames 
       || dol.curWidth != cx 
       || dol.curHeight != cy ) {
       
      dol = new DrawingObjectList(g_real,cx,cy, this, frames);

      // draw the rails
      dol.setColor(Color.black,0,frames-1);
      dol.fillRect(0,cy-diameter/20,cx-1,diameter/40,0,frames-1);
      dol.fillRect(0,cy-diameter/20-diameter/8,cx-1,diameter/40,0,frames-1);
      
      for(ii=0; ii< cx-diameter/12; ii += diameter/12) {
        dol.drawLine(ii,cy-diameter/20,
                   ii+diameter/12,cy-diameter/20-diameter/8,
                   0, frames-1);
      }
    
      for (frame = 0; frame < frames; frame++) {
        dol.setFrame(frame);
        
        //Draw the back wheels
        dol.setColor(Color.blue);
        dol.fillOval(frame+diameter/12,
          cy-diameter/20-diameter/5-diameter/8,diameter/5,diameter/5);
        dol.fillOval(frame+diameter/12-diameter/6,
          cy-diameter/20-diameter/5-diameter/8,diameter/5,diameter/5);
        dol.fillOval(frame+diameter/12-3*diameter/6,
          cy-diameter/20-diameter/4-diameter/8,diameter/4,diameter/4);
       
        // Draw the boiler
        dol.setColor(Color.red);
        dol.fillRect(frame-3*diameter/6,
          cy-diameter/10-3*diameter/8,3*diameter/4,diameter/4);

        // Draw the cab
        dol.setColor(Color.red);
        dol.fillRect(frame-3*diameter/6,
          cy-diameter/10-diameter/2,diameter/4,diameter/4);
          
        // Every 40th frame, emit a puff of smoke, rising in
        // following frames
        if ( frame%40 == 0 ) {
          for (ii = frame; ii < frames; ii++) {
            int irise;
            dol.setFrame(ii);
            dol.setColor(Color.gray);
            irise = (int)Math.sqrt(25.0*(ii-frame))+diameter/16;
            dol.fillOval(frame-3*diameter/6+5*diameter/8,
              cy-diameter/10-diameter/2-irise,
              diameter/8,diameter/8);
          }
          dol.setFrame(frame);
        }

        // Draw the smoke stack
        dol.setColor(Color.green);
        dol.fillRect(frame-3*diameter/6+5*diameter/8,
          cy-diameter/10-diameter/2,diameter/8,diameter/8);


        // Draw the front wheels
        dol.setColor(Color.blue);
        dol.fillOval(frame,
           cy-diameter/20-diameter/5,diameter/5,diameter/5);
        dol.fillOval(frame-diameter/6,
           cy-diameter/20-diameter/5,diameter/5,diameter/5);
        dol.fillOval(frame-3*diameter/6,
           cy-diameter/20-diameter/4,diameter/4,diameter/4);
        
      }

    } 
    
    // display the entire set of frames
    for (frame = 0; frame < frames; frame++) {

 
      dol.ShowPage(this,frame);
      try {
        Thread.sleep(20);               // sleep for 20 msec
      } catch (InterruptedException t){}
    }
   try {
      Thread.sleep(1000);              // sleep or 1 sec
    } catch (InterruptedException t) {}
    repaint();
  }

}
