Contrôler la fluidité de l'animation - Java - Programmation
Marsh Posté le 05-01-2006 à 20:27:26
Une animation de quoi ? Qui utilise quel algorithme ? En Java j'imagine ? ![[:dawa] [:dawa]](https://forum-images.hardware.fr/images/perso/dawa.gif)
Marsh Posté le 05-01-2006 à 21:27:40
Oui, c'est pour une animation java.  
 
Voici mes 2 programmes : 
 
 
import javax.swing.JFrame; 
import javax.swing.JLayeredPane; 
import javax.swing.JLabel; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import java.awt.Container; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 
import javax.swing.Timer; 
 
public class Spaceship extends JFrame implements Runnable, ActionListener 
{ 
 JLayeredPane layeredPane; // volet organisé en couches 
    JLabel labelVaisseau, labelPulsar, labelhomme, labelexplosion; 
 ImageIcon image1, image2, image3, image4; 
 int tailleX1, tailleY1, tailleX2, tailleY2, tailleX3, tailleY3, tailleX4, tailleY4; 
 JButton bouton;  
 Container conteneur; // définition d'un conteneur pour la JFrame 
 Thread th; // définition d'un thread (inactif au début du TP) 
 Panneau fond; 
 Timer pulsar, destruction; // définition d'un timer 
 boolean b;  
 
 public Spaceship() // constructeur 
 { 
 	// titre de la fenêtre 
 	super("Station spatiale" ); 
 	setBackground(Color.white); 
 	// création d'une instance de Panneau de type JPanel 
 	fond = new Panneau("images/terre.jpg" ); 
        // ajout des images dans les labels Swing 
        image1 = new ImageIcon("images/vaisseau.gif" ); 
 	labelVaisseau = new JLabel(image1); 
 	tailleX1 = image1.getIconWidth(); 
 	tailleY1 = image1.getIconHeight(); 
        image2 = new ImageIcon("images/pulsar.gif" ); 
        labelPulsar = new JLabel(image2); 
 	tailleX2 = image2.getIconWidth(); 
 	tailleY2 = image2.getIconHeight(); 
 	image3 = new ImageIcon("images/homme.gif" ); 
 	labelhomme = new JLabel(image3); 
 	tailleX3 = image3.getIconWidth(); 
 	tailleY3 = image3.getIconHeight(); 
 	image4 = new ImageIcon("images/explosion.gif" ); 
 	labelexplosion = new JLabel(image4); 
 	tailleX4 = image4.getIconWidth(); 
 	tailleY4 = image4.getIconHeight(); 
 	// création du bouton 
 	bouton = new JButton(new ImageIcon("images/danger.gif" )); 
 	bouton.setContentAreaFilled(false); 
 	bouton.setBorderPainted(false); 
 	bouton.setFocusPainted(false); 
 	// positionnement des composants dans la fenêtre 
 	fond.setBounds(0, 0, fond.tailleX, fond.tailleY); 
 	labelVaisseau.setBounds(100, 100, tailleX1, tailleY1); 
 	labelPulsar.setBounds(350, 50, tailleX2, tailleY2); 
 	bouton.setBounds(550, 300, 100, 100); 
 	labelhomme.setBounds(50, 150, tailleX3, tailleY3); 
 	labelexplosion.setBounds(50, 10, tailleX4, tailleY4); 
        // création du volet organisé en couches 
        layeredPane = new JLayeredPane(); 
        layeredPane.setPreferredSize(new Dimension(fond.tailleX, fond.tailleY)); 
 	// ajout des composants dans les couches du JLayeredPane 
        layeredPane.add(fond, new Integer(0)); // niveau 0 
 	layeredPane.add(bouton, new Integer(1)); // niveau 1 
 	layeredPane.add(labelVaisseau, new Integer(2)); // niveau 2 
 	layeredPane.add(labelPulsar, new Integer(2)); // niveau 2 
 	layeredPane.add(labelhomme, new Integer(4)); // niveau 4 
 	layeredPane.add(labelexplosion, new Integer(3));//niveau 3 
 	// définition du volet de contenu et mise en place de la gestion en couches  
        conteneur = getContentPane(); 
        conteneur.add(layeredPane); 
 	// mise en place de la fenêtre 
 	pack(); 
 	setVisible(true); 
 	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
 	// création et lancement du pulsar 
 	pulsar = new Timer(1000, this); 
 	pulsar.start(); 
 	//création et lancement de destruction 
 	destruction = new Timer(6000, this); 
 	destruction.start(); 
 	// association de l'observateur au bouton 
 	bouton.addActionListener(this); 
 	th = new Thread(this); 
 	th.start(); 
 	labelexplosion.setVisible(false); 
 } 
 
  public void run() // contenu du thread (inactif au début du TP) 
 { 
 	int tx = 50; 
 	int sens = 1; 
 
 	while(true) 
 	{ 
   try  
   { 
   	th.sleep(50); 
   	tx += sens*5; 
     
   	if (tx==400 || tx==50)  
   	{ 
     sens *= -1;  
     layeredPane.add(labelhomme,(2)); 
   	} 
   	labelhomme.setBounds(tx, 150, tailleX3*2, tailleY3*2); 
   }  
   catch(InterruptedException e) {	System.out.println("Probleme du thread." ); }  
 	} 
 } 
 
    public void actionPerformed(ActionEvent e) // gestion des événements 
    { 
 	if (e.getSource() == bouton)  
 	{ 
   System.out.println("Clic sur le bouton." ); 
   labelexplosion.setVisible(true); 
    
 	} 
 	if (e.getSource() == pulsar) 
 	{ 
   System.out.println("Message lance par le pulsar." + b); 
   labelPulsar.setVisible(b); 
   b = !b; 
 	} 
 	if (e.getSource() == destruction) 
 	{ 
   System.out.println("Destruction du vaisseau." + b); 
   labelVaisseau.setVisible(false); 
   labelexplosion.setVisible(false); 
   bouton.setVisible(false); 
    
 	} 
 } 
 
    public static void main(String [] args) // fonction principale 
 { 
 	new Spaceship(); 
    } 
} 
 
 
et voici le second : 
 
import javax.swing.JPanel;  
import java.awt.Image;  
import java.awt.MediaTracker;  
import java.awt.Graphics;  
 
public class Panneau extends JPanel 
{ 
 Image fond; 
 int tailleX, tailleY; 
 
 Panneau(String fichier) // constructeur 
 { 
 	// chargement de l'image 
 	fond = getToolkit().getImage(fichier); 
 	MediaTracker mt = new MediaTracker(this); 
 	mt.addImage(fond, 0); 
 	try 
 	{ 
   mt.waitForID(0); 
 	} 
 	catch (InterruptedException e) { System.out.println("Probleme de chargement." ); } 
 
 	tailleX = fond.getWidth(null); 
 	tailleY = fond.getHeight(null); 
 }  
 
 public void paintComponent(Graphics g) // méthode d'affichage des composants 
 {  
 	g.drawImage(fond, 0, 0, null); 
 } 
} 
Marsh Posté le 08-01-2006 à 11:15:39
ReplyMarsh Posté le 08-01-2006 à 19:32:37
| post_it a écrit : Hello !  | 
 
 
Il n'y a pas de problème dans mon programme. J'utilise dans ce programme des gif animés, mais il est possible surement d'avoir une meilleure fluidité. Comment on peut la contrôler ? Est-ce qu'utiliser des tableaux d'images le permet ? 
 
Merci d'avance. 
Marsh Posté le 05-01-2006 à 18:40:33
Bonjour,
Quelle alternative faudrait-il adopter pour contrôler la fluidité d'une animation ?
merci d'avance.