Forum - Java
- Togliere lo sfarfallio
Pagine: [ 1 2 3 ]
|
Anonymous (Member )
Guru
Messaggi: 1059
Iscritto: 30/07/2006
Salve gente... premettendo che col java sono alle prime armi... vorrei chiedervi in che modo si può togliere il fastidioso sfarfallio di un applet quando ad esempio si simula il movimento di qualche pallina.. ecco qua il codice dell'applet sfarfallante...
Codice sorgente - presumibilmente Java
package appletpallina ;
import java.awt.* ;
import java.applet.Applet ;
class Pallina {
int x,y;
int vx, vy;
int diametro;
Pallina
( int x,
int y,
int diametro,
Color colore
) { this .x = x;
this .y = y;
vx
= ( int ) ( Math .
random ( ) * 5
+ 1
) ; vy
= ( int ) ( Math .
random ( ) * 5
+ 1
) ; this .colore = colore;
this .diametro = diametro;
}
}
class Movimento
extends Thread { Pallina p;
AppletPallina applet;
boolean stopped= false ;
Movimento
( AppletPallina applet,
int x,
int y,
int diametro,
Color colore
) { this .applet = applet;
p= new Pallina( x,y,diametro,colore) ;
}
public void run( ) {
int ampiezza= applet.getWidth ( ) ;
int altezza= applet.getHeight ( ) ;
for ( ;; ) {
applet.repaint ( ) ;
try {
}
if ( p.x + p.diametro >= ampiezza) {
p.vx =- p.vx ;
p.
colore = ( new Color ( ( int ) ( Math .
random ( ) * 255
) ,
( int ) ( Math .
random ( ) * 255
) ,
( int ) ( Math .
random ( ) * 255
) ) ) ;
}
if ( p.y + p.diametro >= altezza) {
p.vy =- p.vy ;
p.
colore = ( new Color ( ( int ) ( Math .
random ( ) * 255
) ,
( int ) ( Math .
random ( ) * 255
) ,
( int ) ( Math .
random ( ) * 255
) ) ) ; }
if ( p.x < 0 && p.vx < 0) {
p.vx =- p.vx ;
p.
colore = ( new Color ( ( int ) ( Math .
random ( ) * 255
) ,
( int ) ( Math .
random ( ) * 255
) ,
( int ) ( Math .
random ( ) * 255
) ) ) ; }
if ( p.y < 0 && p.vy < 0) {
p.vy =- p.vy ;
p.
colore = ( new Color ( ( int ) ( Math .
random ( ) * 255
) ,
( int ) ( Math .
random ( ) * 255
) ,
( int ) ( Math .
random ( ) * 255
) ) ) ; }
p.x = p.x + p.vx ;
p.y = p.y + p.vy ;
if ( stopped)
break ;
}
System .
out .
println ( getName
( ) + " fermato" ) ; }
}
public class AppletPallina
extends Applet { final int n= 20 ;
Movimento vettore[ ] = new Movimento[ n] ;
public void init( ) {
for ( int i= 0 ; i< n; i++ ) {
vettore
[ i
] = new Movimento
( this , 10, 10, 50,
Color .
YELLOW ) ; vettore[ i] .start ( ) ;
}
}
g.clearRect ( 0,0,getWidth( ) ,getHeight( ) ) ;
for ( int i= 0 ; i< n; i++ ) {
g.setColor ( vettore[ i] .p .colore ) ;
g.fillOval ( vettore[ i] .p .x , vettore[ i] .p .y , ( int ) ( vettore[ i] .p .diametro ) , ( int ) ( vettore[ i] .p .diametro ) ) ;
}
}
public void stop( ) {
try {
for ( int i= 0 ; i< n; i++ ) {
vettore[ i] .stopped = true ;
vettore[ i] .join ( ) ;
vettore[ i] = null ;
}
}
System .
out .
println ( "Si è verificato un errore" ) ; }
}
}
netarrow (Admin )
Guru^2
Messaggi: 2502
Iscritto: 12/05/2004
devi usare il doppio buffering.
cioè invece di scrivere direttamente nel Graphics dello schermo crei un'oggetto ImageBuffer, disegni sul suo Graphics e alla fine disegni l'ImageBuffer sullo schermo, così viene disegnato a schermo l'immagine già pronta a non c'è più sfarfallio.
Anonymous (Member )
Guru
Messaggi: 1059
Iscritto: 30/07/2006
ho provato a creare un nuovo oggetto di tipo ImageBuffer... ma netbeans me lo segnala errore..
netarrow (Admin )
Guru^2
Messaggi: 2502
Iscritto: 12/05/2004
scusa ho controllato il nome corretto della classe è BufferedImage
Anonymous (Member )
Guru
Messaggi: 1059
Iscritto: 30/07/2006
ok.. quindi una volta che faccio
BufferedImage antiSfarfallio = new BufferedImage(...);
dentro che parametri gli servono??
e poi dopo per fargli disegnare dentro a quell'oggetto devo fare così?
Codice sorgente - presumibilmente Java
for ( int i= 0 ; i< n; i++ ) {
aniSfarfallio.setColor ( vettore[ i] .p .colore ) ;
aniSfarfallio.fillOval ( vettore[ i] .p .x , vettore[ i] .p .y , ( int ) ( vettore[ i] .p .diametro ) , ( int ) ( vettore[ i] .p .diametro ) ) ;
}
al posto di:
Codice sorgente - presumibilmente Java
for ( int i= 0 ; i< n; i++ ) {
g.setColor ( vettore[ i] .p .colore ) ;
g.fillOval ( vettore[ i] .p .x , vettore[ i] .p .y , ( int ) ( vettore[ i] .p .diametro ) , ( int ) ( vettore[ i] .p .diametro ) ) ;
}
???
netarrow (Admin )
Guru^2
Messaggi: 2502
Iscritto: 12/05/2004
Inizializzi così:
Codice sorgente - presumibilmente Java
dove w è la larghezza e h l'altezza dell'immagine di buffering (che sarà la dimensione del pannello su cui disegni) e il terzo è la modalità di rappresentazione dell'immagine mettendo RGB ha i solito colori rappresentati da rosso verde blue da 0 a 255.
A questo punti dentro al metodo paint invece di fare direttamente le operazioni su g le fai su gbuf, e alla fine fai
g.drawImage(buffer);
Anonymous (Member )
Guru
Messaggi: 1059
Iscritto: 30/07/2006
sul
Codice sorgente - presumibilmente Plain Text
mi chiede altri parametri oltre alla variabile buffer...
e provando a mettere
Codice sorgente - presumibilmente Plain Text
g.drawImage(buffer, 0, 0, this);
lo sfarfallio mi fa peggio di prima perché mi si visualizzano strisce e basta, ogni tanto qui e ogni tanto li ma globalmente l'applet rimane bianco... XD
Ultima modifica effettuata da Anonymous il 04/04/2009 alle 13:45
netarrow (Admin )
Guru^2
Messaggi: 2502
Iscritto: 12/05/2004
le modifiche da fare sono queste:
Codice sorgente - presumibilmente Java
...
public void init( ) {
gbuf = buffer.getGraphics ( ) ;
for ( int i= 0 ; i< n; i++ ) {
vettore
[ i
] = new Movimento
( this , 10, 10, 50,
Color .
YELLOW ) ; vettore[ i] .start ( ) ;
}
}
gbuf.clearRect ( 0,0,getWidth( ) ,getHeight( ) ) ;
for ( int i= 0 ; i< n; i++ ) {
gbuf.setColor ( vettore[ i] .p .colore ) ;
gbuf.fillOval ( vettore[ i] .p .x , vettore[ i] .p .y , ( int ) ( vettore[ i] .p .diametro ) , ( int ) ( vettore[ i] .p .diametro ) ) ;
}
g.drawImage ( buffer, 0, 0, this ) ;
}
...
Per sicurezza ho pure provato il codice e funziona senza sfarfallii.
Anonymous (Member )
Guru
Messaggi: 1059
Iscritto: 30/07/2006
boooooh
io l'unica cosa che noto è che lo sfondo è nero invece che bianco... poi sennò lo sfarfallio rimane tanto quanto ce ne era prima.... :S è normale???
Codice sorgente - presumibilmente Java
public class AppletPallina
extends Applet { final int n= 20 ;
Movimento vettore[ ] = new Movimento[ n] ;
public void init( ) {
gbuf= buffer.getGraphics ( ) ;
for ( int i= 0 ; i< n; i++ ) {
vettore
[ i
] = new Movimento
( this , 10, 10, 50,
Color .
YELLOW ) ; vettore[ i] .start ( ) ;
}
}
gbuf.clearRect ( 0,0,getWidth( ) ,getHeight( ) ) ;
for ( int i= 0 ; i< n; i++ ) {
gbuf.setColor ( vettore[ i] .p .colore ) ;
gbuf.fillOval ( vettore[ i] .p .x , vettore[ i] .p .y , ( int ) ( vettore[ i] .p .diametro ) , ( int ) ( vettore[ i] .p .diametro ) ) ;
}
g.drawImage ( buffer, 0, 0, this ) ;
}