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 ?
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.