Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Java - Togliere lo sfarfallio
Forum - Java - Togliere lo sfarfallio

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
Anonymous (Member)
Guru


Messaggi: 1059
Iscritto: 30/07/2006

Segnala al moderatore
Postato alle 19:36
Giovedì, 02/04/2009
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

  1. package appletpallina;
  2. import java.awt.*;
  3. import java.applet.Applet;
  4.  
  5. class Pallina {
  6.     int x,y;
  7.     int vx, vy;
  8.     int diametro;
  9.     Color colore;
  10.     Pallina(int x, int y, int diametro, Color colore){
  11.         this.x=x;
  12.         this.y=y;
  13.         vx=(int)(Math.random()*5+1);
  14.         vy=(int)(Math.random()*5+1);
  15.         this.colore=colore;
  16.         this.diametro=diametro;
  17.     }
  18. }
  19.  
  20. class Movimento extends Thread{
  21.     Pallina p;
  22.     AppletPallina applet;
  23.     boolean stopped=false;
  24.  
  25.     Movimento(AppletPallina applet,int x, int y, int diametro,Color colore){
  26.         this.applet=applet;
  27.         p=new Pallina(x,y,diametro,colore);
  28.     }
  29.     public void run(){
  30.         int ampiezza=applet.getWidth();
  31.         int altezza=applet.getHeight();
  32.         for(;;){
  33.             applet.repaint();
  34.             try{
  35.                 Thread.sleep(10);
  36.             }catch (InterruptedException e){
  37.             }
  38.             if(p.x+p.diametro>=ampiezza){
  39.                 p.vx=-p.vx;
  40.                 p.colore=(new Color((int)(Math.random()*255),(int)(Math.random()*255),(int)(Math.random()*255)));
  41.  
  42.             }
  43.             if(p.y+p.diametro>=altezza){
  44.                 p.vy=-p.vy;
  45.                 p.colore=(new Color((int)(Math.random()*255),(int)(Math.random()*255),(int)(Math.random()*255)));
  46.             }
  47.             if(p.x<0 && p.vx<0){
  48.                 p.vx=-p.vx;
  49.                 p.colore=(new Color((int)(Math.random()*255),(int)(Math.random()*255),(int)(Math.random()*255)));
  50.             }
  51.             if(p.y<0 && p.vy<0){
  52.                 p.vy=-p.vy;
  53.                 p.colore=(new Color((int)(Math.random()*255),(int)(Math.random()*255),(int)(Math.random()*255)));
  54.             }
  55.             p.x=p.x+p.vx;
  56.             p.y=p.y+p.vy;
  57.             if (stopped)
  58.                 break;
  59.         }
  60.         System.out.println(getName()+" fermato");
  61.     }
  62. }
  63.  
  64.  
  65. public class AppletPallina extends Applet {
  66.     final int n=20;
  67.     Movimento vettore[]=new Movimento[n];
  68.  
  69.     public void init() {
  70.  
  71.        
  72.         for (int i=0;i<n;i++){
  73.             vettore[i]=new Movimento (this, 10, 10, 50, Color.YELLOW);
  74.             vettore[i].start();
  75.         }
  76.     }
  77.  
  78.     public void paint(Graphics g){
  79.         g.clearRect(0,0,getWidth(),getHeight());
  80.  
  81.        
  82.         for (int i=0;i<n;i++){
  83.             g.setColor(vettore[i].p.colore);
  84.             g.fillOval(vettore[i].p.x, vettore[i].p.y, (int)(vettore[i].p.diametro), (int)(vettore[i].p.diametro));
  85.         }        
  86.     }
  87.     public void stop(){
  88.         try{
  89.             for (int i=0;i<n;i++){
  90.                 vettore[i].stopped=true;
  91.                 vettore[i].join();
  92.                 vettore[i]=null;
  93.             }
  94.         }
  95.         catch (InterruptedException e){
  96.         System.out.println("Si è verificato un errore");
  97.         }
  98.     }
  99.    
  100. }


PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 9:31
Venerdì, 03/04/2009
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.

PM Quote
Avatar
Anonymous (Member)
Guru


Messaggi: 1059
Iscritto: 30/07/2006

Segnala al moderatore
Postato alle 19:48
Venerdì, 03/04/2009
ho provato a creare un nuovo oggetto di tipo ImageBuffer... ma netbeans me lo segnala errore..


PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 20:49
Venerdì, 03/04/2009
scusa ho controllato il nome corretto della classe è BufferedImage

PM Quote
Avatar
Anonymous (Member)
Guru


Messaggi: 1059
Iscritto: 30/07/2006

Segnala al moderatore
Postato alle 21:09
Venerdì, 03/04/2009
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

  1. for (int i=0;i<n;i++){
  2.             aniSfarfallio.setColor(vettore[i].p.colore);
  3.             aniSfarfallio.fillOval(vettore[i].p.x, vettore[i].p.y, (int)(vettore[i].p.diametro), (int)(vettore[i].p.diametro));
  4.         }



al posto di:

Codice sorgente - presumibilmente Java

  1. for (int i=0;i<n;i++){
  2.             g.setColor(vettore[i].p.colore);
  3.             g.fillOval(vettore[i].p.x, vettore[i].p.y, (int)(vettore[i].p.diametro), (int)(vettore[i].p.diametro));
  4.         }



???

PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 12:54
Sabato, 04/04/2009
Inizializzi così:

Codice sorgente - presumibilmente Java

  1. BufferedImage buffer = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
  2.         Graphics gbuf = buffer.getGraphics();



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

PM Quote
Avatar
Anonymous (Member)
Guru


Messaggi: 1059
Iscritto: 30/07/2006

Segnala al moderatore
Postato alle 13:42
Sabato, 04/04/2009
sul
Codice sorgente - presumibilmente Plain Text

  1. g.drawImage(buffer);



mi chiede altri parametri oltre alla variabile buffer...
e provando a mettere
Codice sorgente - presumibilmente Plain Text

  1. 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
PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 14:10
Sabato, 04/04/2009
le modifiche da fare sono queste:

Codice sorgente - presumibilmente Java

  1. ...
  2.         BufferedImage buffer;
  3.         Graphics gbuf;
  4.        
  5.     public void init() {
  6.                 buffer = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);
  7.                 gbuf = buffer.getGraphics();
  8.                
  9.         for (int i=0;i<n;i++){
  10.             vettore[i]=new Movimento (this, 10, 10, 50, Color.YELLOW);
  11.             vettore[i].start();
  12.         }
  13.     }
  14.        
  15.     public void paint(Graphics g){
  16.         gbuf.clearRect(0,0,getWidth(),getHeight());
  17.                
  18.                
  19.         for (int i=0;i<n;i++){
  20.             gbuf.setColor(vettore[i].p.colore);
  21.             gbuf.fillOval(vettore[i].p.x, vettore[i].p.y, (int)(vettore[i].p.diametro), (int)(vettore[i].p.diametro));
  22.         }
  23.         g.drawImage(buffer, 0, 0, this);
  24.     }
  25. ...



Per sicurezza ho pure provato il codice e funziona senza sfarfallii.

PM Quote
Avatar
Anonymous (Member)
Guru


Messaggi: 1059
Iscritto: 30/07/2006

Segnala al moderatore
Postato alle 14:53
Sabato, 04/04/2009
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

  1. public class AppletPallina extends Applet {
  2.     final int n=20;
  3.     Movimento vettore[]=new Movimento[n];
  4.     BufferedImage buffer;
  5.     Graphics gbuf;
  6.     public void init() {
  7.         buffer= new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);
  8.         gbuf= buffer.getGraphics();
  9.        
  10.         for (int i=0;i<n;i++){
  11.             vettore[i]=new Movimento (this, 10, 10, 50, Color.YELLOW);
  12.             vettore[i].start();
  13.         }
  14.     }
  15.  
  16.     public void paint(Graphics g){
  17.  
  18.         gbuf.clearRect(0,0,getWidth(),getHeight());
  19.  
  20.  
  21.         for (int i=0;i<n;i++){
  22.             gbuf.setColor(vettore[i].p.colore);
  23.             gbuf.fillOval(vettore[i].p.x, vettore[i].p.y, (int)(vettore[i].p.diametro), (int)(vettore[i].p.diametro));
  24.         }
  25.         g.drawImage(buffer, 0, 0, this);
  26.     }


PM Quote
Pagine: [ 1 2 3 ] Precedente | Prossimo