Mettre une animation derrière les composants

Fermé
feria35 - 30 juin 2013 à 23:40
 feria35 - 1 juil. 2013 à 18:18
Bonjour,
Je fais un petit jeu et à la fin de la partie je souhaiterais une petite animation qui remplit progressivement le fond d'écran de "Bravo !" mais que le fond, pas sur les boutons. C'est bien là mon problème, mes boutons sont surchargés par les écritures, on ne les voit plus.
Autre chose : Cette animation s'arrête lorsqu'on clique n'importe où sur l'écran.

J'obtiens bien ce résultat si j'abandonne l'animation : en mettant la boucle à l'intérieur de paintComponent. Mais comment y ajouter la thread et voir progressivement les "Bravo !" s'inscrire un par un progressivement ?

Je ne peux pas non plus faire une animation ponctuée de repaint() car sinon je n'ai que le dernier "Bravo !" et je perds tous les précédents.

Je vous joins mon code (une version très très simplifiée).
Merci pour toute l'aide que vous voudrez bien m'apporter.
public class essai extends JApplet {
	private static final long serialVersionUID = 1L;
 
	class MaThread extends Thread {    //=========== Classe MaThread
		int r = 0, x = 0, y = 0;
	    boolean finir;
	    JPanel panneauDisque;
 
	    MaThread(JPanel panneauDisque) { //----------- Constructeur
	    	this.panneauDisque = panneauDisque;
	    }
 
	   synchronized void stopper() {  //------------ Pour arreter la Thread
		  finir = true;
		  notify();
	    }
 
	    public void run() {   //------------------- Démarrage de la Thread
		int L = panneauDisque.getSize().width;
		int H = panneauDisque.getSize().height;
		Graphics g = panneauDisque.getGraphics();
		Graphics2D g2d = ( Graphics2D ) g.create();
	        g2d.setFont( new Font( "Tiresias PCFont Z", Font.BOLD, 40 ) );
		finir = false;
		    //Animation = Ecrire pleins de "Bravo !" dans le fond d'écran
		    //Cette Animation s'arrête si on clic sur l'écran (finir -> false)
		 for (int i = 0; i < 30; i++) {   
		    	try { sleep(200); }
		    		catch (InterruptedException exc) {}
		    	if (finir) break;  
		    	g2d.setColor(new Color((528424*i)%Integer.MAX_VALUE)); //variation de couleur
		    	r += 10 ;
		    	x = (int) (L/2 + r*Math.cos(i*Math.PI/6)); //coordonnées selon une spirale
		    	y = (int) (H/2 - r*Math.sin(i*Math.PI/6));
		    	g2d.drawString( "Bravo !", x, y );
		 }
	    }  // Fin de la méthode run de la thread
	} //Fin de la classe MaThread
 
	class PanneauCentre extends JPanel {  //== Classe PanneauCentre
		private static final long serialVersionUID = 1L;
		JButton boutonGagné;
		JButton[] pion = new JButton[15]; 
		boolean bravo = false, finir = false;
		MaThread thread = null;
		JPanel panneau;
 
		public PanneauCentre () {   //------------------- Constructeur
			setLayout(new FlowLayout());	
			//Remplissage de la grille avec des boutons et des labels
			for (int k=0 ; k<pion.length; k++) {
				pion[k] = new JButton("bouton"+k);
				pion[k].setEnabled(false);
				add(pion[k]);
				JPanel vide = new JPanel();
				add(vide);
			}
			boutonGagné = new JButton ("Valider la partie");
			add(boutonGagné);
			this.panneau = this;
			jeu();  //on lance le jeu
		} // Fin du constructeur PanneauCentre 
 
		public void paintComponent(Graphics g) {  //----- Toile de fond paintComponent
			int L = this.getSize().width;
			int H = this.getSize().height;
			super.paintComponent(g);
			Graphics2D g2d = ( Graphics2D ) g.create();
		        /*
			 *   (diverses instructions)
			 */
		} // Fin de PaintComponent
 
		public void jeu() {   //----------------- Une partie de jeu
			/*
			 *   le déroulement du jeu (diverses instructions)
			 */
 
			boutonGagné.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent e) {
                                               //validation de la partie
						bravo = true;
						if ((thread == null)||(!thread.isAlive())) {
						     thread = new MaThread(panneau);
						     thread.start(); // animation
							}
		       getContentPane().addMouseListener(new MouseAdapter(){
				        public void mousePressed(MouseEvent e){
                                      //arrêt de l'animation dès qu'on clique sur l'écran
				                if (thread != null) thread.stopper();
				                 thread = null;				             		
				                 }
				       public void mouseReleased(MouseEvent e){
				                if (thread != null) thread.stopper();
				             	    thread = null;
				                }
 
				        public void mouseEntered(MouseEvent e) { }
 
				        public void mouseExited(MouseEvent e) { }
					});
					}
				});
		} //Fin de la méthode "jeu"
}//Fin de la classe PanneauCentre
 
	public void init() {
		this.setSize(250, 250);
		JPanel panneau = new PanneauCentre();
		getContentPane().add(panneau);
	}
}

1 réponse

Voici une solution :


import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;

import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JPanel;



public class essai2 extends JApplet {
	private static final long serialVersionUID = 1L;
	
	class MaThread extends Thread {    //============================= Classe MaThread
		int r = 0, x = 0, y = 0;
	    boolean finir;
	    JPanel panneauDisque;
	    ImageHandler image;

	    MaThread(JPanel panel,ImageHandler image) { //----------- Constructeur
	    	this.panneauDisque=panel;
	    	this.image = image;
	    }
	    
	   synchronized void stopper() {  //------------ Pour arreter de la Thread
		  finir = true;
		  notify();
	    }
	  
	   
	    public void run() {   //------------------- Démarrage de la Thread
		finir = false;
		    //Animation = Ecrire pleins de "Bravo !" dans le fond d'écran
		    //Cette Animation s'arrête si on clic sur l'écran (finir -> false)
		 for (int i = 0; i < 30; i++) {   
			 	try { sleep(200); }
	    		catch (InterruptedException exc) {finir=true; break;}
		    	if (finir) break;  
				int L = panneauDisque.getSize().width;
				int H = panneauDisque.getSize().height;
				Graphics2D g2d = image.getImage(L,H).createGraphics();
			    g2d.setFont( new Font( "Tiresias PCFont Z", Font.BOLD, 40 ) );
		    	g2d.setColor(new Color((528424*i)%Integer.MAX_VALUE)); //variation de couleur
		    	r += 10 ;
		    	x = (int) (L/2 + r*Math.cos(i*Math.PI/6)); //coordonnées d'une spirale
		    	y = (int) (H/2 - r*Math.sin(i*Math.PI/6));
		    	g2d.drawString( "Bravo !", x, y );
				g2d.dispose();
				repaint();
		 }
	    }  // Fin de la méthode run de la thread
	} //Fin de la classe MaThread
	
	public class ImageHandler  {
		BufferedImage image = null;
		
		public BufferedImage getImage() {
			return image;
		}
		public BufferedImage getImage(int width, int height) {
			if ( (width>0 && height>0 ) && (image==null || image.getWidth()<width || image.getHeight()<height) ) {
                // si la taille du panel est > 0, si l'image n'existe pas ou que l'image précédente était plus petite, on créé une nouvelle image
				BufferedImage newimage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
				if (image!=null) {
                // on dessine l'image précédente dans la nouvelle image, pour ne pas perdre les "bravos" précédents
					Graphics2D g=newimage.createGraphics();
					g.drawImage(image, 0,0, null);
					g.dispose();
				}
				image=newimage;
			}
			return image;
		}
 
	}
	
	class PanneauCentre extends JPanel 	{  //======================= Classe PanneauCentre
		private static final long serialVersionUID = 1L;
		JButton boutonGagné;
		JButton[] pion = new JButton[15]; 
		boolean bravo = false, finir = false;
		MaThread thread = null;
		JPanel panneau;
		ImageHandler imageHandler = new ImageHandler() ;
	
		public PanneauCentre () {   //-------------------------------------- Constructeur
			setLayout(new FlowLayout());
			
			//Remplissage de la grille avec des boutons et des labels
			for (int k=0 ; k<pion.length; k++) {
				pion[k] = new JButton("bouton"+k);
				pion[k].setEnabled(false);
				add(pion[k]);
				JPanel vide = new JPanel();
				add(vide);
			}
			boutonGagné = new JButton ("Valider la partie");
			add(boutonGagné);
			this.panneau = this;
			jeu();  //on lance le jeu
		} // Fin du constructeur PanneauCentre 
		
		public void paintComponent(Graphics g) {  //----- Toile de fond paintComponent
			int L = this.getSize().width;
			int H = this.getSize().height;

			super.paintComponent(g);
			if (imageHandler.getImage() != null) g.drawImage(imageHandler.getImage(), 0, 0, null);
				
		} // Fin de PaintComponent
		
		public void jeu() {   //----------------- Une partie de jeu
			/*
			 *   le déroulement du jeu (diverses instructions)
			 */
			
			boutonGagné.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent e) { //validation de la partie
							bravo = true;
							if ((thread == null)||(!thread.isAlive())) {
								 		
									    thread = new MaThread(panneau,imageHandler);
									    thread.start(); // déclenchement de l'animation
							}
									
							getContentPane().addMouseListener(new MouseAdapter(){
				                     public void mousePressed(MouseEvent e){   //arrêt de l'animation dès 
				                    	 if (thread != null) thread.stopper(); //qu'on clique sur l'écran
				             		    thread = null;				             		
				                     }
				                     public void mouseReleased(MouseEvent e){
				                    	 if (thread != null) thread.stopper();
				             		    thread = null;
				                     }
				                     
				                     public void mouseEntered(MouseEvent e) { }
				                     
				                     public void mouseExited(MouseEvent e) { }
							});
					}
				});
		} //Fin de la méthode "jeu"
}//Fin de la classe PanneauCentre
	
	public void init() {
		this.setSize(250, 250);
		JPanel panneau = new PanneauCentre();
		getContentPane().add(panneau);
	}
}


0