ANIMAZIONI


 


 

Animazioni

Le animazioni di solito usano da 10 a 20 fotogrammi al secondo (standard =12)

I loop generalmente sono implementati in un thread proprio, mai nel paint() o update().

Il cuore del loop esegue le sequenti azioni

1) incrementa il numero di frame (fotogramma)

2) chiama il metodo repaint() per visualizzare le nuove frame

3) sleep per (delay) millisecondi

 

 

Eliminare il flashing

Il motivo dipende dal fatto che l’awt richiede che un componente (applet, canvas, frame) ridisegni se stesso chiamando il metodo update(), e l’implementazione di default di tale metodo ripulisce tutto il background dell’oggetto prima di chiamare il paint().

La soluzione sta nel far ripulire tutto il background solo quando e’ necessario

ci sono 2 modi:

1- Sovrascrivere il metodo update()

public void paint(Graphics g) {

update(g);

}

public void update(Graphics g) {

Color bg = getBackground();

Color fg = getForeground();

...//same as old paint() method until we draw the rectangle:

if (fillSquare) {

g.fillRect(x, y, w, h);

fillSquare = false;

} else {

g.setColor(bg);

g.fillRect(x, y, w, h);

g.setColor(fg);

fillSquare = true;

}

...//same as old paint() method

}

2- Implementando il doublebuffering

Consiste nel raggruppare piu’ operazioni grafiche in un buffer grafico non visualizzato e quindi visualizzare l’immagine cosi’ creata sullo schermo

public void update(Graphics g) {

...//First, initialize variables and create the

//offscreen buffer as shown above. Then erase the

//previous image:

offGraphics.setColor(getBackground());

offGraphics.fillRect(0, 0, d.width, d.height);

offGraphics.setColor(Color.black);

...//Do everything the old paint() method did --

//until we draw the rectangle.

if (fillSquare) {

offGraphics.fillRect(x, y, w, h);

fillSquare = false;

} else {

fillSquare = true;

}

...//The rest is exactly like the old paint() method

//until the very end, when we add the following:

//Paint the image onto the screen.

g.drawImage(offImage, 0, 0, this);

}

 

 

 

Muovere un immagine sullo schermo

Viene realizzato caricando l’immagine da muovere, lo sfondo, e in piu’ un semplice algoritmo per determinare dove disegnare l’immagine in movimento

 

 

 

Incrementare le prestazioni

I 2 problemi piu’ probabili sono la visualizzazione di immagini parziali durante il loro caricarmento e/o il lungo tempo di caricamento delle stesse.

Il primo problema e’ risolvibile con il MediaTracker che scarica i dati da un gruppo di immagini e le spedisce quando sono completamente caricate. Per controllare se i dati di un gruppo di immagini sono precaricate, si puo’ usare le forme di checkID() e checkAll() che restituiscono un valore booleano (caricano i dati in modo asincrono)

Per caricare i dati in modo sincrono si puo’ usare waitForID() e waitForAll().

Per testare lo stato del caricamento dell’immagine si puo’ usare i metodi statusID() e statusAll().

Il secondo problema (dovuto all’apertura di tante connessioni http quante sono le immagini) puo’ essere risolto creando uno strip, cioe’ un file che contiene diverse immagini in riga e visualizzando solo la parte che interessa.

 

 

 

Eseguire suoni

L’interfaccia AudioClip fornisce il supporto base per eseguire suoni in formato 8bit, 8000Hz, ulow, mono, .au

definisce i seguenti metodi: