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

public class cammina extends Applet implements Runnable {

/* Dimensioni previste dell'applet */
private final int MAXX = 240;
private final int MAXY = 240;
/* Dimensioni della pallina */
private final int DIMX = 24;
private final int DIMY = 24;
/* Coordinate correnti della pallina */
private int xo = 0;
private int yo = 0;
/* Singolo movimento in pixel */
private final int STEP = 10;
/* Costanti per la direzione del movimento */
private final int E = 0;
private final int S = 1;
private final int W = 2;
private final int N = 3;
/* Variabile di stato: direzione corrente */
private int dir = E;
/* La pallina che si muove */
private Image dot = null;

/* Il thread dell'animazione !!! */
Thread avanza = null;

  /* Init deve solamente lanciare il caricamento della pallina */
  public void init () {
    dot = getImage(getCodeBase(), "lista.gif");
  }

  /* Deve far partire l'animazione */	
  public void start() {
    if (avanza == null) {                    // Se il thread non esiste ancora
      avanza = new Thread(this, "cammina");  // Lo crea 
      avanza.start();                        // E lo fa partire
    }
  }

  /* Metodo che esegue il 'lavoro duro' - azione */
  public void run() {
    // Questo metodo viene invocato per ogni thread dell'Applet, quindi deve
    // eseguire il lavoro solo nel caso il thread sia quello dell'animazione
    // Il loop termina quando l'attributo avanza viene messo a null in stop()
    while (Thread.currentThread() == avanza) {
      switch (dir) {         // A seconda dllo stato (la direzione corrente)
        case E :             // Verso Est
          xo += STEP;        // Aumenta la X
          if (xo >= MAXX) {  // Se arriva al bordo destro
            dir = S;         // Cambia direzione (va a Sud)
          }
          break;
        case S :             // Verso Sud
          yo += STEP;        // Aumenta la Y
          if (yo >= MAXY) {  // Se arriva al bordo inferiore
            dir = W;         // Cambia direzione (va a Ovest)
          }
          break;
        case W :             // Verso Ovest
          xo -= STEP;        // Cala la X
          if (xo <= 0) {     // Se arriva al bordo sinistro
            dir = N;         // Cambia direzione (va a Nord)
          }
          break;
        case N :             // Verso Nord
          yo -= STEP;        // Cala la Y
          if (yo <= 0) {     // Se arriva al bordo superiore
            dir = E;         // Cambia direzione (va di nuovo a Est)
          }
          break;
      };
        	
      repaint();                        // Ridisegna l'Applet
      try {
        Thread.sleep(100);              // Attende 100 mS
      } catch (InterruptedException e){ // Nessuna azione
      }
    }
  }

  /* Se usciamo dalla pagina, elimina il thread */
  public void stop() {
    avanza = null; // se 'avanza' diventa 'null', il metodo 'run' termina
  }

  /* Funzione di disegno che semplicemente disegna la pallina alle coordinate fissate */	
  synchronized public void paint(Graphics g) {
    g.drawImage (dot, xo, yo, this);
  }
}