Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1572 connectés 

  FORUM HardWare.fr
  Programmation
  Java

   Mettre une animation derrière les composants

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Mettre une animation derrière les composants

n°2196061
feria35
Posté le 01-07-2013 à 00:38:43  profilanswer
 

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.
 

Code :
  1. public class essai extends JApplet {
  2. private static final long serialVersionUID = 1L;
  3. class MaThread extends Thread {    //=========== Classe MaThread
  4.  int r = 0, x = 0, y = 0;
  5.     boolean finir;
  6.     JPanel panneauDisque;
  7.     MaThread(JPanel panneauDisque) { //----------- Constructeur
  8.      this.panneauDisque = panneauDisque;
  9.     }
  10.    synchronized void stopper() {  //------------ Pour arreter la Thread
  11.    finir = true;
  12.    notify();
  13.     }
  14.     public void run() {   //------------------- Démarrage de la Thread
  15.  int L = panneauDisque.getSize().width;
  16.  int H = panneauDisque.getSize().height;
  17.  Graphics g = panneauDisque.getGraphics();
  18.  Graphics2D g2d = ( Graphics2D ) g.create();
  19.         g2d.setFont( new Font( "Tiresias PCFont Z", Font.BOLD, 40 ) );
  20.  finir = false;
  21.      //Animation = Ecrire pleins de "Bravo !" dans le fond d'écran
  22.      //Cette Animation s'arrête si on clic sur l'écran (finir -> false)
  23.   for (int i = 0; i < 30; i++) { 
  24.       try { sleep(200); }
  25.        catch (InterruptedException exc) {}
  26.       if (finir) break
  27.       g2d.setColor(new Color((528424*i)%Integer.MAX_VALUE)); //variation de couleur
  28.       r += 10 ;
  29.       x = (int) (L/2 + r*Math.cos(i*Math.PI/6)); //coordonnées selon une spirale
  30.       y = (int) (H/2 - r*Math.sin(i*Math.PI/6));
  31.       g2d.drawString( "Bravo !", x, y );
  32.   }
  33.     }  // Fin de la méthode run de la thread
  34. } //Fin de la classe MaThread
  35. class PanneauCentre extends JPanel {  //== Classe PanneauCentre
  36.  private static final long serialVersionUID = 1L;
  37.  JButton boutonGagné;
  38.  JButton[] pion = new JButton[15];
  39.  boolean bravo = false, finir = false;
  40.  MaThread thread = null;
  41.  JPanel panneau;
  42.  public PanneauCentre () {   //------------------- Constructeur
  43.   setLayout(new FlowLayout());
  44.   //Remplissage de la grille avec des boutons et des labels
  45.   for (int k=0 ; k<pion.length; k++) {
  46.    pion[k] = new JButton("bouton"+k);
  47.    pion[k].setEnabled(false);
  48.    add(pion[k]);
  49.    JPanel vide = new JPanel();
  50.    add(vide);
  51.   }
  52.   boutonGagné = new JButton ("Valider la partie" );
  53.   add(boutonGagné);
  54.   this.panneau = this;
  55.   jeu();  //on lance le jeu
  56.  } // Fin du constructeur PanneauCentre  
  57.  public void paintComponent(Graphics g) {  //----- Toile de fond paintComponent
  58.   int L = this.getSize().width;
  59.   int H = this.getSize().height;
  60.   super.paintComponent(g);
  61.   Graphics2D g2d = ( Graphics2D ) g.create();
  62.          /*
  63.    *   (diverses instructions)
  64.    */
  65.  } // Fin de PaintComponent
  66.  public void jeu() {   //----------------- Une partie de jeu
  67.   /*
  68.    *   le déroulement du jeu (diverses instructions)
  69.    */
  70.   boutonGagné.addActionListener(new ActionListener() {
  71.     public void actionPerformed(ActionEvent e) {
  72.                                                //validation de la partie
  73.      bravo = true;
  74.      if ((thread == null)||(!thread.isAlive())) {
  75.           thread = new MaThread(panneau);
  76.           thread.start(); // animation
  77.       }
  78.         getContentPane().addMouseListener(new MouseAdapter(){
  79.            public void mousePressed(MouseEvent e){
  80.                                       //arrêt de l'animation dès qu'on clique sur l'écran
  81.                    if (thread != null) thread.stopper();
  82.                     thread = null;               
  83.                     }
  84.           public void mouseReleased(MouseEvent e){
  85.                    if (thread != null) thread.stopper();
  86.                      thread = null;
  87.                    }
  88.            public void mouseEntered(MouseEvent e) { }
  89.            public void mouseExited(MouseEvent e) { }
  90.     });
  91.     }
  92.    });
  93.  } //Fin de la méthode "jeu"
  94. }//Fin de la classe PanneauCentre
  95. public void init() {
  96.  this.setSize(250, 250);
  97.  JPanel panneau = new PanneauCentre();
  98.  getContentPane().add(panneau);
  99. }
  100. }


mood
Publicité
Posté le 01-07-2013 à 00:38:43  profilanswer
 

n°2196165
feria35
Posté le 01-07-2013 à 18:14:34  profilanswer
 

Voici une solution :
 

Code :
  1. import java.awt.Color;
  2. import java.awt.FlowLayout;
  3. import java.awt.Font;
  4. import java.awt.Graphics;
  5. import java.awt.Graphics2D;
  6. import java.awt.event.ActionEvent;
  7. import java.awt.event.ActionListener;
  8. import java.awt.event.MouseAdapter;
  9. import java.awt.event.MouseEvent;
  10. import java.awt.image.BufferedImage;
  11. import javax.swing.JApplet;
  12. import javax.swing.JButton;
  13. import javax.swing.JPanel;
  14. public class essai2 extends JApplet {
  15. private static final long serialVersionUID = 1L;
  16. class MaThread extends Thread {    //============================= Classe MaThread
  17.  int r = 0, x = 0, y = 0;
  18.     boolean finir;
  19.     JPanel panneauDisque;
  20.     ImageHandler image;
  21.     MaThread(JPanel panel,ImageHandler image) { //----------- Constructeur
  22.      this.panneauDisque=panel;
  23.      this.image = image;
  24.     }
  25.    
  26.    synchronized void stopper() {  //------------ Pour arreter de la Thread
  27.    finir = true;
  28.    notify();
  29.     }
  30.  
  31.  
  32.     public void run() {   //------------------- Démarrage de la Thread
  33.  finir = false;
  34.      //Animation = Ecrire pleins de "Bravo !" dans le fond d'écran
  35.      //Cette Animation s'arrête si on clic sur l'écran (finir -> false)
  36.   for (int i = 0; i < 30; i++) { 
  37.     try { sleep(200); }
  38.       catch (InterruptedException exc) {finir=true; break;}
  39.       if (finir) break
  40.    int L = panneauDisque.getSize().width;
  41.    int H = panneauDisque.getSize().height;
  42.    Graphics2D g2d = image.getImage(L,H).createGraphics();
  43.       g2d.setFont( new Font( "Tiresias PCFont Z", Font.BOLD, 40 ) );
  44.       g2d.setColor(new Color((528424*i)%Integer.MAX_VALUE)); //variation de couleur
  45.       r += 10 ;
  46.       x = (int) (L/2 + r*Math.cos(i*Math.PI/6)); //coordonnées d'une spirale
  47.       y = (int) (H/2 - r*Math.sin(i*Math.PI/6));
  48.       g2d.drawString( "Bravo !", x, y );
  49.    g2d.dispose();
  50.    repaint();
  51.   }
  52.     }  // Fin de la méthode run de la thread
  53. } //Fin de la classe MaThread
  54. public class ImageHandler  {
  55.  BufferedImage image = null;
  56.  public BufferedImage getImage() {
  57.   return image;
  58.  }
  59.  public BufferedImage getImage(int width, int height) {
  60.   if ( (width>0 && height>0 ) && (image==null || image.getWidth()<width || image.getHeight()<height) ) {
  61.                 // 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
  62.    BufferedImage newimage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
  63.    if (image!=null) {
  64.                 // on dessine l'image précédente dans la nouvelle image, pour ne pas perdre les "bravos" précédents
  65.     Graphics2D g=newimage.createGraphics();
  66.     g.drawImage(image, 0,0, null);
  67.     g.dispose();
  68.    }
  69.    image=newimage;
  70.   }
  71.   return image;
  72.  }
  73. }
  74. class PanneauCentre extends JPanel  {  //======================= Classe PanneauCentre
  75.  private static final long serialVersionUID = 1L;
  76.  JButton boutonGagné;
  77.  JButton[] pion = new JButton[15];
  78.  boolean bravo = false, finir = false;
  79.  MaThread thread = null;
  80.  JPanel panneau;
  81.  ImageHandler imageHandler = new ImageHandler() ;
  82.  public PanneauCentre () {   //-------------------------------------- Constructeur
  83.   setLayout(new FlowLayout());
  84.   //Remplissage de la grille avec des boutons et des labels
  85.   for (int k=0 ; k<pion.length; k++) {
  86.    pion[k] = new JButton("bouton"+k);
  87.    pion[k].setEnabled(false);
  88.    add(pion[k]);
  89.    JPanel vide = new JPanel();
  90.    add(vide);
  91.   }
  92.   boutonGagné = new JButton ("Valider la partie" );
  93.   add(boutonGagné);
  94.   this.panneau = this;
  95.   jeu();  //on lance le jeu
  96.  } // Fin du constructeur PanneauCentre  
  97.  public void paintComponent(Graphics g) {  //----- Toile de fond paintComponent
  98.   int L = this.getSize().width;
  99.   int H = this.getSize().height;
  100.   super.paintComponent(g);
  101.   if (imageHandler.getImage() != null) g.drawImage(imageHandler.getImage(), 0, 0, null);
  102.  } // Fin de PaintComponent
  103.  public void jeu() {   //----------------- Une partie de jeu
  104.   /*
  105.    *   le déroulement du jeu (diverses instructions)
  106.    */
  107.   boutonGagné.addActionListener(new ActionListener() {
  108.     public void actionPerformed(ActionEvent e) { //validation de la partie
  109.       bravo = true;
  110.       if ((thread == null)||(!thread.isAlive())) {
  111.             thread = new MaThread(panneau,imageHandler);
  112.             thread.start(); // déclenchement de l'animation
  113.       }
  114.       getContentPane().addMouseListener(new MouseAdapter(){
  115.                         public void mousePressed(MouseEvent e){   //arrêt de l'animation dès  
  116.                          if (thread != null) thread.stopper(); //qu'on clique sur l'écran
  117.                       thread = null;               
  118.                         }
  119.                         public void mouseReleased(MouseEvent e){
  120.                          if (thread != null) thread.stopper();
  121.                       thread = null;
  122.                         }
  123.                       
  124.                         public void mouseEntered(MouseEvent e) { }
  125.                       
  126.                         public void mouseExited(MouseEvent e) { }
  127.       });
  128.     }
  129.    });
  130.  } //Fin de la méthode "jeu"
  131. }//Fin de la classe PanneauCentre
  132. public void init() {
  133.  this.setSize(250, 250);
  134.  JPanel panneau = new PanneauCentre();
  135.  getContentPane().add(panneau);
  136. }
  137. }


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

   Mettre une animation derrière les composants

 

Sujets relatifs
Mettre classe client et classe serveur dans un seul main[PHP et HTML] Mettre une varial PHP lors d'un click d'un bouton HTML.
[RESOLU]mettre le background-image en 800x600 tout simplement !Ne pas mettre à jour TCD à l'ouverture
Mettre Gecko dans c++ builderdans une boucle for ou mettre <br/> ( résolu )
Comment mettre automatiquement une lettre à un hdd ext en Fichier .batProblème lien animation flash / HTML
composant 2D html pour animation de combatMettre en route un vieux robot Youpi
Plus de sujets relatifs à : Mettre une animation derrière les composants


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR