//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; 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(); } }