//
import java.awt.*;
        
public class BA extends java.applet.Applet implements Runnable
{
//------------- GENERIC STOPPABLE APPLET -------------
   Object lock = new Object();
   boolean isLocked = false;
   Thread t;
   public void init() {
      if (t == null) { t = new Thread(this); t.start(); }
   }
   public void start() {
      synchronized(lock) { lock.notifyAll(); }
      isLocked = false;
   }
   public void stop()  { isLocked = true; }
   public void run() {
      try { while (true) {
         if (isLocked) synchronized(lock) { lock.wait(); }
         repaint();
         t.sleep(30);
      } } catch(Exception e){ System.out.println(e); };
   }
//------------- GENERIC DOUBLE BUFFERED APPLET -------------
   private Rectangle r = new Rectangle(0,0,0,0);
   private Image bufferImage = null;
   protected Graphics bufferGraphics = null;
   public boolean damage = true;
   int frame = 0;
   public void update(Graphics g) {
      if (r.width != bounds().width || r.height != bounds().height) {
         bufferImage    = createImage(bounds().width, bounds().height);
         bufferGraphics = bufferImage.getGraphics();
         r = bounds();
         damage = true;
      }
      if (damage || (frame++ % 30) == 0) {
         damage = false;
         render(bufferGraphics);
         if (bufferImage != null)
            g.drawImage(bufferImage,0,0,this);
      }
   }
   public void render(Graphics g) { }
}