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);
}
}