Home E-Books Effetti speciali e sviluppo giochi in Java Semplici animazioni grafiche

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 >>