//File: BlinkApplet.java /* This is a simple flip-book based drawing of a head with one eye shifting side-to-side and the other winking. H. J. Bernstein, 2 December 2001 */ import java.awt.*; import java.awt.event.*; import java.awt.image.*; import java.applet.Applet; public class BlinkApplet extends Applet { // Global data FlipBook fb = null; // Initialization public void init() { setBackground(Color.white); } // paint method to do 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)); // If we have a 300x300 pixel image, we will have 24 frames // At 90000 pixels per frame, this means 2,160,000 // pixels. frames = diameter/10; // If the flip-book exists and is the right size // use the pages we already created. if ( fb == null || fb.curFrames != frames || fb.curWidth != cx || fb.curHeight != cy ) { fb = new FlipBook(g_real,cx,cy, this, frames); for (frame = 0; frame < frames; frame++) { g = fb.g[frame]; // Draw hair g.setColor(Color.red); g.fillOval(cx/2-diameter/3,(cy-diameter)/2-diameter/12, 2*diameter/3, diameter/3); // Draw the head itself g.setColor(Color.yellow); g.fillOval((cx-diameter)/2, (cy-diameter)/2, diameter, diameter); // Draw two ears g.fillOval((cx-diameter)/2-diameter/10,cy/2-diameter/8, diameter/5,diameter/4); g.fillOval((cx+diameter)/2-diameter/10,cy/2-diameter/8, diameter/5,diameter/4); // Draw brow line and smile g.setColor(Color.blue); g.drawArc((cx-3*diameter/4)/2,(cy-3*diameter/4)/2, 3*diameter/4,3*diameter/4, 60, 60); g.drawArc((cx-3*diameter/4)/2,(cy-3*diameter/4)/2, 3*diameter/4,3*diameter/4, -50, -80); // Now draw two eyes { int shift; shift = frame - frames/4; if (shift > frames/2) shift = 3*frames/4 - frame; g.setColor(Color.blue); // left side eye (actually the right eye of the head) // this eye will shift g.drawOval((cx-3*diameter/8-diameter/5)/2, (cy-diameter/10)/2, diameter/5,diameter/10); g.fillOval((cx-3*diameter/8-diameter/10)/2+shift, (cy-diameter/10)/2, diameter/10,diameter/10); // right side eye // this eye will blink g.drawOval((cx+3*diameter/8-diameter/5)/2, (cy-diameter/10)/2, diameter/5,diameter/10); g.fillOval((cx+3*diameter/8-diameter/10)/2, (cy-diameter/10)/2, diameter/10,diameter/10); if (shift > -frames/6 && shift < frames/6) { // go to half closed g.setColor(Color.yellow); g.fillArc((cx+3*diameter/8-diameter/5)/2-1, (cy-diameter/10)/2-1, diameter/5+2,diameter/10+2, 0, 180); g.setColor(Color.blue); if (shift > -frames/8 && shift < frames/8 ) { // go to fully closed g.setColor(Color.yellow); g.fillArc((cx+3*diameter/8-diameter/5)/2-1, (cy-diameter/10)/2, diameter/5+2,diameter/10-1, 0, -180); g.setColor(Color.blue); g.drawArc((cx+3*diameter/8-diameter/5)/2-1, (cy-diameter/10)/2, diameter/5+2,diameter/10-1, 0, -180); } else { g.drawLine((cx+3*diameter/8-diameter/5)/2,cy/2, (cx+3*diameter/8+diameter/5)/2,cy/2); } } } } } // display the entire flip-book for (frame = 0; frame < frames; frame++) { fb.ShowPage(this,frame); try { Thread.sleep(50); // sleep for 50 msec } catch (InterruptedException t){} } try { Thread.sleep(1000); // sleep for 1 sec } catch (InterruptedException t) {} repaint(); } }