import java.awt.*;
import java.applet.*;


public class Ball extends Applet implements Runnable {
    int x, y;           // Ballkoordinaten
    int grundlinie;     
    int anz;            // Anzahl der Schritte bis Wechsel hoch/runter
    int schritt;        // Abstand zwichen 2 Schritten auf X-Achse
    int durchmesser;    // Ballgr÷˜e
    boolean clipping;
    boolean zeigclipping;
    Thread ball = null;


   public void init() {
      durchmesser = 25; 
      anz = 9;
      schritt = 4;
      grundlinie = Math.round ( Math.round(0.5*anz*anz) )+durchmesser+20;
   }
   
   public void start(){
      if ( ball == null ) {
         ball = new Thread ( this );
         ball.start();
      }   
   }
   
   public void stop() {
      if ( ball != null ) {
         ball.stop();
         ball = null;
      }
   }
   
   public boolean mouseDown ( Event e, int x, int y ) {
      clipping = !clipping;    
      return true;
   }

   public void run() {
      boolean nachrechts = false;
      boolean hoch = true;
      int i = 0; 
       
      x = schritt+100;
      
      clipping = false;
      zeigclipping = false;
      
      while ( true ) {
         if ( x < schritt || x+durchmesser+schritt  >= size().width ) {
            nachrechts = !nachrechts;
            hoch = !hoch;
         }
         if ( nachrechts ) 
            x += schritt;
         else 
            x -= schritt;
            
         if ( i < 0 || i >= anz )
            hoch = !hoch;
         if ( hoch )
           i++;
         else   
           i--;
           
         y = Math.round ( Math.round(0.5*i*i) )+20;
          
          repaint();
         try { ball.sleep(100); }
         catch ( InterruptedException e ) {}          
      }
   }
   
   public void update ( Graphics g ) {
      if ( clipping ) {
         g.clipRect ( x-schritt, y-2*(anz-1), durchmesser+2*schritt, durchmesser+4*(anz-1));
      }
      paint ( g );
      
   }
       
   public void paint ( Graphics g ) {  
      int breite = size().width;                                   
      int hoehe = size().height;
      for ( int i = 0; i < 6; i++ ) { 
         g.setColor ( new Color( (float)(0.2*i), (float)(0.1*i), 1 ) );
         g.fillArc ( -100+70*i, 20*i-50, breite+2*(100-70*i), 2*(grundlinie-20*i+50), 0, 180 );
      }

      g.setColor ( Color.green );
      g.fillRect ( 0, grundlinie, breite, hoehe );
      g.setColor ( Color.black );
      g.drawString ( "Clipping wird durch Mausklick an- oder abgestellt.", 0, hoehe-3 );
      
      g.setColor ( Color.red );  
      g.fillOval ( x, y, durchmesser, durchmesser ); 
   }

}                                                              
