import java.applet.*; import java.awt.*; import java.net.*; class Animate extends Thread { Marcus mskay; public Animate(Marcus who) { mskay = who; } public void run() { while(mskay.running) { mskay.advanceFrame(); mskay.repaint(); try { sleep(mskay.sleeptime); } catch(Exception e){} } } } public class Marcus extends Applet { int nframe; Image image[]; AudioClip audio[]; URL url[]; int sleeptime; MediaTracker tracker; Animate animate; int frame; boolean running; private Image offScreenImage; private Dimension offScreenSize; private Graphics offScreenGraphics; public void advanceFrame() { frame = (frame + 1) % nframe; } public void init() { String parameter; // init number of frames parameter = getParameter("nframe"); if (parameter == null) System.out.println("Error: invalid parameter: nframe"); else nframe = Integer.parseInt(parameter); // init images image = new Image[nframe]; tracker = new MediaTracker(this); for (int i = 0; i < nframe; i++) { parameter = getParameter("image"+i); if (parameter == null) System.out.println("Error: invalid parameter: image"+i); else { image[i] = getImage(getDocumentBase(), parameter); tracker.addImage(image[i], i); } } try { tracker.waitForAll(); } catch (InterruptedException e) { System.out.println("Error waiting for image to load."); } // init audio audio = new AudioClip[nframe]; for (int i = 0; i