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
Il motivo dipende dal fatto che lawt richiede che un componente (applet, canvas, frame) ridisegni se stesso chiamando il metodo update(), e limplementazione di default di tale metodo ripulisce tutto il background delloggetto 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 limmagine 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 limmagine da muovere, lo sfondo, e in piu un semplice algoritmo per determinare dove disegnare limmagine in movimento
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 dellimmagine si puo usare i metodi statusID() e statusAll().
Il secondo problema (dovuto allapertura 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.
Linterfaccia AudioClip fornisce il supporto base per eseguire suoni in formato 8bit, 8000Hz, ulow, mono, .au
definisce i seguenti metodi: