//
Disques animées en Java (double buffering avec awt)
/** DisquesDessinF.java Animer des boules; double tampon (version awt)
Dans une fenêtre affichage standard
Dans une autre, dessin dans un tampon image, puis affichage
(redéfinition de update(Graphics g) et double buffering)
Un thread pour déplacer les boules (class DisquesAnimés)
Un thread pour dessiner (class Dessiner)
http://java.developpez.com/sources/?page=AWT
*/
// Les classes dans ce fichier:
// public class DisquesDessinF extends Frame
// class Dessiner extends Thread
// class DisquesAnimés extends Thread
// class UnDisque
// import javax.swing.*;
import java.awt.*;
import java.awt.Graphics; // pour contexte graphique des tracés
import java.awt.Dimension; // pour dimension de la zone à effacer
import java.awt.Component; // pour la surface de dessin
import java.awt.Color;
import java.awt.Image; // pour tampon caché
import java.awt.event.*; //
public class DisquesDessinF extends Frame {
static final int ROTATION=1, REFLEXION=2, DROITE=3;
static final int NBD=200;
static final int RAYON=20;
static final int PIXPARSEC=70; // pixels par secondes
int xMax=400, yMax=400; // taille de la fenêtre
static final int REBOND=ROTATION;
DisquesAnimés dd; // les disques qui bougent
int ATTENTEDISQUE=100; // déplacer les disques chaque 100 ms.
int ATTENTEDESSIN=30; // redessiner chaque 60 millisecondes
boolean avecTampon; // double buffering
Image imCachée; Graphics cgTampon;
public DisquesDessinF(int n, int xf, int yf, boolean avec) {
avecTampon=avec;
dd = new DisquesAnimés(n,ATTENTEDISQUE);
dd.start();
Dessiner d = new Dessiner(this,ATTENTEDESSIN);
d.start();
stopApplication();
if(avec) this.setTitle(" AVEC TAMPON "+n+" disques");
else this.setTitle(" SANS TAMPON "+n+" disques");
this.setSize(xMax,yMax);this.setLocation(xf,yf);
this.show();
}
private void stopApplication() {
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) { System.exit(0);}
});
}
public void paint(Graphics cg) {
Graphics g=cg;
Dimension d=this.getSize();
if(avecTampon) { // technique tampon caché (double buffering)
if(cgTampon==null) {
// Au premier affichage uniquement
imCachée = createImage(d.width,d.height);
cgTampon = imCachée.getGraphics();
}
cgTampon.clearRect(0,0,d.width,d.height);
cgTampon.drawString( "Disques ...", 10, 45);
dd.dessiner(cgTampon);
cg.drawImage(imCachée,0,0,null); // affichage effectif
}
else { // technique standard
cg.clearRect(0,0,d.width,d.height);
cg.drawString( "Disques ...", 10, 45);
dd.dessiner(cg);
}
}
public void update(Graphics g) {paint(g);}
/** Renvoie un entier entre 0 et max-1 (pratique pour l'aspect aléatoire) */
static int unEntier(int max) { return (int)(max*Math.random()); }
public static void main(String mots[]) {
DisquesDessinF fen=new DisquesDessinF(NBD,100,100,false);
DisquesDessinF fen2=new DisquesDessinF(NBD,100,400,true);
}
// classe interne (un seul objet de cette classe)
/** Pour afficher (classe interne: un seul objet de cette classe) */
class Dessiner extends Thread {
int attenteDessin=30;
Component sd;
Dessiner(Component c, int a) { sd=c;attenteDessin=a;}
public void run() {
while(true) {
sd.repaint();
try { sleep(attenteDessin); }
catch (Exception e) { System.out.println(" "+ e); }
}
}
}
/** Déplacements d'un groupe de disques; méthode dessiner (classe interne) */
class DisquesAnimés extends Thread {
UnDisque td[];
int attenteDisque;
DisquesAnimés (int n, int a) {
attenteDisque=a;
td = new UnDisque[n];
for(int i=0; i= xMax) rebondir(2);
else if(yC-rayon <= 0 ) rebondir(3);
else if(yC+rayon >= yMax) rebondir(4);
}
// modifier delta
void rebondir(int r) {
int dx=dX;
switch(REBOND) {
case ROTATION: // rotation 90°
if(r==1) // par la gauche
if(dY>0) { dX=dY; dY=-dx;} else {dX=-dY; dY=dx; }
else if(r==2) // par la droite
if(dY>0) {dX=-dY; dY=dx; } else { dX=dY; dY=-dx;}
else if(r==3) // par le haut
if(dX>0) {dX=-dY; dY=dx; } else { dX=dY; dY=-dx; }
else if(r==4) // par le bas
if(dX>0) { dX=dY; dY=-dx; } else { dX=-dY; dY=dx; }
break;
case REFLEXION: // réflexxion standard
// System.out.println(""+xC+","+yC+" "+dX+","+dY);
if(r==1 || r==2) {
// if(r==1) xC++; else xC--;
// System.out.println("r g ou d "+xC+","+yC+" "+dX+","+dY);
dX=-dX; // par la gauche ou la droite
}
else if(r==3 || r==4) dY=-dY; // par le haut ou le bas
break;
case DROITE: // en restant sur la même droite
dX=-dX; dY=-dY;
break;
}
}
void dessiner(Graphics cg) {
cg.setColor(couleur);
cg.fillOval(xC-rayon,yC-rayon,2*rayon,2*rayon);
}
} //fin class UnDisque
} //fin DisquesDessinF.java