Effetti speciali e sviluppo giochi in Java(TM) -Semplici animazioni grafiche
di Anibal Wainstein (traduzione di Hanami Solutions)
3.2 Semplici animazioni grafiche
Sinora, ci siamo occupati solo di animazioni nelle finestre
di status. Personalmente reputo questo tipo di effetti
irritante quando li incontro su Internet. Ora, daremo un'occhiata
alle animazioni grafiche, le quali sono il più grande
punto di forza delle applets Java e che lo rendono così
superiore ad altre tecnologie per gli effetti speciali come
GIF animate, DHTML o JavaScript.
3.2.1 Sincronizzazione dei thread
Come spiegato nella sezione 3.0,
dovete essere molto cauti nell'uso dei threads. Ne vedremo
un esempio ora.
Abbiamo fino ad adesso usato il metodo paint() per disegnare
sullo schermo della applet. Questo metodo è invocato
automaticamente dal thread del programma (thread principale)
quando lo schermo ha bisogno di essere aggiornato.
Ora che abbiamo due threads e che iniziamo ad animare lo
schermo della applet, dobbiamo invocare il metodo paint()
un certo numero di volte al secondo. Ci sono grosse
probabilità che il thread principale e il thread che
ci siamo creati da soli entrino in conflitto tra loro.
Per evitarlo, scriviamo la parola synchronized dopo "public"
nel nostro metodo paint() sovrascritto:
public synchronized void paint(Graphics g)
{
}
Un thread non può accedere ad un metodo se c'è
già al suo interno un altro thread che sta operando
con quella parte di codice. Al momento questo è quanto
dobbiamo sapere affinché la nostra applet non si pianti
per colpa di un conflitto tra thread.
3.2.2 Come bloccare sfarfallii grigi
in una applet sovrascrivendo il metodo update()
Se andiamo a creare delle animazioni col metodo paint(),
allora dobbiamo anche sovrascrivere il metodo update(). Questo metodo
viene invocato a volte dal browser prima di aggiornare lo schermo
della applet per pulirlo (usando il colore grigio). Questo porta
ad uno sfarfallio grigio quando lanciate una animazione col metodo paint().
Perciò deve essere messo fuori gioco con le seguenti righe di
codice:
public synchronized void update(Graphics g)
{ paint(g);
}
Ora il metodo update() non pulirà lo schermo, ma invocherà
il metodo paint() piuttosto. Come vedete questo metodo dovrebbe anche
essere sincronizzato.
3.2.3 Uno scroller grafico di testo
Realizzeremo ora una applet simile a quella già fatta
nella sezione 3.1.1, ma stavolta
il testo scorrerà nello schermo dell'applet.
Copiate statusscroller.java dalla sezione 3.1.1
e cambiate init() e run() come segue:
public void init()
{
message="Basic Course in Special Effects and "; message+="Game Development in Java(TM)";
} public void run()
{ while (true) { update(getGraphics()); try {Thread.sleep(50);} catch(InterruptedException e) {} }
}
Non c'è nulla di strano in questo metodo init(). Abbiamo
però rifatto il metodo run() di modo che usi la nuova
tecnica di aggiornamento. Ora invochiamo il metodo update()
20 volte al secondo (usando una pausa di 50 millisecondi). Come
argomento gli diamo l'oggetto Graphics, il quale è collegato
allo schermo della applet e che potete ottenere col metodo getGraphics().
Questo metodo invocherà a sua volta il metodo paint(), che appare
come segue:
public int x=100; public synchronized void paint(Graphics g)
{ //Dipingi lo schermo di nero. g.setColor(Color.black); g.fillRect(0,0,100,20); //Traccia il messaggio usando
//il colore bianco
//partendo dalla posizione "x". g.setColor(Color.white); g.drawString(meddelande,x,12);
//Controlla che la posizione "x" del messaggio
//non sia inferiore a x=-400. Se è così allora
//imposta "x" alla posizione 100 (questo renderà
//il testo invisibile). if (x<-400) x=100;
//Decrementate "x" di 1 di modo che il testo si sposti
//a sinistra. x--;
}
Vi prego di notare che abbiamo aggiunto la dichiarazione
della nuova variabile "x", oltre alla dichiarazione
di "animationthread" e "message", che
esistevano già nel codice dal vecchio esempio. Questa variabile
immagazzinerà la posizione orizzontale del testo (posizione-x),
anche dopo che il metodo paint() sia stato invocato. Questa posizione
inizierà a 100 e finirà a -400. Dato che lo schermo della applet
è largo solo 100 pixels, il testo non sarà visibile
all'inizio, ma si muoverà lentamente a sinistra fino
a scomparire dalla vista. La variabile "x" avrà
a quel punto il valore -400 pixels ed allora sarà il momento
di ricominciare da capo. Questo è il motivo per cui viene
usata la dichiarazione "if".

L'effetto che ha la variabile "x" sulla posizione del
testo che scorre.
Potreste chiedervi perché abbia aggiunto 12 pixels alla posizione y
della stringa? Come abbiamo detto nella sezione
2.1.4,
il testo viene tracciato sopra la riga di base. Trattandosi di
un font di 12 punti, ho spostato il testo di 12 pixels. Sfortunatamente
questo trucco non funzionerà con fonts più larghi, ma vedremo una
soluzione più avanti. Osservate lo scroller di testo clickando
qui. Noterete probabilmente che il testo sfarfalla un pò.
Nel capitolo 4, come eliminarlo usando la ben nota tecnica del double buffering.
Pagina seguente >>
|