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