Animation graphique - PowerPoint PPT Presentation

1 / 30
About This Presentation
Title:

Animation graphique

Description:

Normal car par defaut, c'est ce que fait paintComponent : dessine un rectangle ... On peut ne pas le faire si on est sur de redessiner la totalit de la ... – PowerPoint PPT presentation

Number of Views:61
Avg rating:3.0/5.0
Slides: 31
Provided by: buf4
Category:

less

Transcript and Presenter's Notes

Title: Animation graphique


1
Animation graphique
2
Animation graphique
  • Trois méthodes dans lesquelles on a le droit de
    dessiner !
  • paintComponent(Graphics g)
  • Repaint()
  • Super.paintComponent(Graphics g)
  • Interdiction de dessiner ailleurs !
  • Mais on peut dans des méthodes appelées par
    paintComponent !

3
Animation Graphique
  • En général, paintComponent commence par appeler
    super.paintComponent(g)
  • A pour effet deffacer le contenu du composant,
  • Normal car par defaut, cest ce que fait
    paintComponent dessine un rectangle de la
    couleur du fond dans le composant.
  • On peut ne pas le faire si on est sur de
    redessiner la totalité de la surface
  • Optimisation !

4
Animation graphique
  • Comment faire ?
  • Un thread danimation, qui fait des appels à
    repaint()
  • repaint() provoque lappel asynchrone de
    paintComponent(Graphics g)
  • Pas de paintChildren(..), de validate(..) etc.
  • Dans PaintComponent on parcourt la ou les
    listes/tableaux dobjets à dessiner et on appelle
    leur méthode dessineToi(Graphics g)
  • Nécessité davoir une hiérarchie de classe si on
    veut mettre tous les objets dans une même
    collection
  • Mais ce nest pas obligatoire, on peut vouloir
    gérer séparément des Personnes et des Ascenseurs
    par exemple.

5
Exemple
  • c.ajouteObjetDessinable(new ImageAnimee(100, 100,
    "toto.gif"))
  • c.ajouteObjetDessinable(new ImageAnimee(200, 200,
    "toto.gif"))
  • c.ajouteObjetDessinable(new Cercle(100, 100, 20)
  • public void run()
  • while(true)
  • // On demande à redessiner les cercles
  • repaint()
  • // On "dort" tempsEntreFrame millisecondes
  • thread.sleep(tempsEntreFrames)

6
Exemple suite
  • public void paintComponent(Graphics gc)
  • super.paintComponent(gc)
  • Collection liste listeObjetsDessinables.getAl
    l()
  • // On affiche les objets animés
  • for(ObjetDessinable objetDessinable liste)
  • objetDessinable.dessineToi(gc)

7
Lutilisation dinterfaces est recommandée !
  • public interface Dessinable
  • public void dessineToi(Graphics gc)
  • public interface Deplacable
  • public void move()
  • Etc

8
Déplacer les objets ?
  • Deux stratégies
  • On fait tout dans le même thread que lanimation
  • Dans le paintComponent() on appelle aussi une
    méthode updateState() ou deplaceToi() de chaque
    objet avant de le dessiner.
  • Si on veut une vitesse réelle constante, on peut
    mesurer le temps et passer des paramètres à ces
    méthodes.
  • Chaque objet est un thread et il met à jour son
    état en permanence
  • Beaucoup plus compliqué à gérer au niveau de la
    synchronisation
  • Nécessité dutiliser des ThreadGroups si on veut
    faire suspend/resume sur les objets

9
Exemple avec un seul Thread
  • public void paintComponent(Graphics gc)
  • super.paintComponent(gc)
  • Collection liste listeObjetsDessinables.getAl
    l()
  • // On affiche les objets animés
  • for(ObjetDessinable objetDessinable liste)
  • objetDessinable.deplaceToi()
  • objetDessinable.dessineToi(gc)

10
Exemple ou chaque objet est un Thread
  • import java.awt.
  • public class ObjetGraphique implements Runnable,
    Dessinable
  • protected int x, y // position du centre
  • protected int largeur, hauteur // Boite
    englobante de l'objet
  • // Constructeurs
  • public ObjetGraphique(int x, int y, int
    largeur, int hauteur)
  • this.x x
  • this.y y
  • new (this).start()
  • public void run()
  • int incX1, incY1
  • while(true)
  • // ici changer x, y
  • // On déplace l'objet
  • move(x, y)

11
Objet concret un cercle
  • import java.awt.
  • public class Cercle extends ObjetGraphique //
    Il est donc un Dessinable aussi !
  • int rayon // le rayon du cercle
  • // Constructeurs
  • public Cercle(int x, int y, int rayon)
  • super(x, y, 2 rayon, 2 rayon)
  • this.rayon rayon
  • public void dessineToi(Graphics gc)
  • super.dessineToi(gc)
  • gc.drawOval(x - rayon, y - rayon,
  • 2 rayon, 2 rayon)
  • public void move(int x, int y)

12
Si les objets se déplacent seuls
  • public void paintComponent(Graphics gc)
  • super.paintComponent(gc)
  • Collection liste listeObjetsDessinables.ge
    tAll()
  • // On affiche les objets animés
  • for(ObjetDessinable objetDessinable liste)
  • // Inutile de les déplacer !
  • // objetDessinable.deplaceToi()
  • objetDessinable.dessineToi(gc)

13
Exemple de ThreadGroup
  • import java.awt.
  • public class ObjetGraphique implements Runnable,
    Dessinable
  • static ThreadGroup tg new
    ThreadGroup("ObjetsDessinables")
  • protected int x, y // position du centre
  • protected int largeur, hauteur // Boite
    englobante de l'objet
  • // Constructeurs
  • public ObjetGraphique(int x, int y, int
    largeur, int hauteur)
  • this.x x
  • this.y y
  • new Thread(tg, this).start()
  • // Méthodes statiques
  • / On réveille tous les threads des objets
    graphiques /
  • static public void suspend()

14
Quelques nouveautés intéressantes
15
Amélioration des performances de la JVM
  • Sun a engagé depuis le JDK 1.4.2 un effort
    considérable pour améliorer sa plate-forme.
  • Un effort particulier autours de Swing pour le
    rendre plus performant.
  • Ces efforts se traduisent par
  • Limitation du nombre dinstances utilisées.
  • Restructuration de limplémentation interne des
    APIs, sans remettre en cause la partie publique.
  • Ce qui impacte directement le temps utilisé par
    le garbage collector.
  • Exemple de code

16
Amélioration des performances de la JVM
  • Code à récupérer
  • Nombre dinstances allouées sous
  • 1.4.2 25217 objets,
  • 5.0 16272 objets,
  • 6.0 3284 objets !

17
Mise en uvre dIHMs via AWT et Swing
amélioration du rendu visuel
  • Deux évolutions majeures permettent daméliorer
    le rendu visuel de vos applications
  • Support tant attendu du sub-pixel antialiasing,
  • Implémentation dun véritable double buffering au
    cur de Swing/AWT/Java2D
  • Cette implémentation supprime le fameux effet de
    rectangle gris que lon observe en déplaçant une
    fenêtre par-dessus une application Swing.

18
Mise en uvre dIHMs via AWT et Swing
intégration avec le window manager
  • Affichage dun  splash screen  au démarrage de
    lapplication possible à partir dun fichier
    image (gif, jpg, png).
  • Nouvelle classe java.awt.SpashScreen notamment
    utilise pour fermer les splash screens.
  • Deux techniques peuvent être utilisées
  • Soit en passant un paramère de java
  • Java spashfilename.gif monpackage.MonAppli
  • Soit en utilisant le fichier Manifest de
    larchive .jar
  • Manifest-Version 1.0
  • Main-Class monpackage.MonAppli
  • SplashScreen-Image fil
  • ename.gif

19
Mise en uvre dIHMs via AWT et Swing
intégration avec le window manager
  • Intégration de votre application avec le bureau
    du Window Manager grâce à la classe
    java.awt.Desktop
  • Cette classe interagit avec le bureau en
    utilisant la configuration actuelle (navigateur
    par défaut, outil de mail par défaut,
    associations de fichiers etc.)
  • Principales possibilités
  • Lancement du navigateur web, de loutil de mail,
  • Ouverture dune appli java lorsquon double
    clique sur un type de fichier,
  • Impression avec les paramètres par défaut,
  • Ouverture dun explorateur de fichiers sur un
    répertoire donné
  • Exemple de code à étudier dans le wiki

20
Mise en uvre dIHMs via AWT et Swing
intégration avec le window manager
  • Un petit exemple dutilisation de la classe
    java.awt.Desktop pour louverture du navigateur
    web par défaut sur une URL
  • import java.awt.Desktop
  • import java.net.URL
  • public class LaunchBrowser
  • Public static void main(String args)
  • if(Desktop.isDesktopSupported())
  • if(Desktop.getDesktop().isSupported(Desktop
    .Action.BROWSE))
  • Desktop.getDesktop().browse(new
    URL("http//www.google.com"))

21
Utilisation de wildcards () dans les CLASSPATHs
  • Par défaut la JVM doit savoir où se trouvent les
    fichiers .class. Trois solutions permettent de
    gérer cet aspect
  • Editer la variable denvironnement CLASSPATH,
  • Utiliser loption cp sur la ligne de commande de
    démarrage de la JVM (java cp.)
  • Placer un jar dans le répertoire
    JDK_HOME/jre/lib/ext
  • Avec les deux premières techniques on spécifie
  • Un nom de répertoire,
  • Un nom de fichier .jar (Java Archive)

22
Utilisation de wildcards () dans les CLASSPATHs
  • La version 6.0 du J2SE permet maintenant
    dutiliser le caractère à la suite dun
    répertoire pour avoir la visibilité sur plusieurs
    jars.
  • Exemple dutilisation
  • SET CLASSPATHlib/
  • Java Application.Start
  • Code à étudier dans le wiki

23
Quelques améliorations du langage les
métadonnées en Java 1/3
  • Permettent dadjoindre des annotations à une
    classe ainsi quà ses champs
  • Sont définies dans le code source
  • Se retrouvent via le moteur de réflexion de java
    (java.lang.reflect)
  • Il nest plus nécessaire de fournir de fichiers
    supplémentaires pour la description dune classe.
  • La classe BeanInfo pour la technologie JavaBean
  • Les interfaces distantes pour les services webs
    et les composants EJBs
  • Les descripteurs de déploiement des applications
    J2EE

24
Quelques améliorations du langage les
métadonnées en java 2/3
  • La librairie J2SE 1.5 contient déjà quelques
    annotations
  • _at_deprecated java.lang (mais encore peu
    utilisée)
  • _at_Overrides java.lang

25
Quelques améliorations du langage les
métadonnées en java 3/3
  • import java.io.Serializable
  • import javax.persistence.
  • _at_Entity
  • _at_Table(name "MANUFACTURER")
  • _at_NamedQueries(
  • _at_NamedQuery(name "Manufacturer.findByManufacture
    rId",
  • query "SELECT m FROM Manufacturer m
    WHERE m.manufacturerId manufacturerId"),
  • _at_NamedQuery(name "Manufacturer.findByName",
  • query "SELECT m FROM Manufacturer m
    WHERE m.name name"),
  • public class Manufacturer implements Serializable
  • private static final long serialVersionUID
    1L
  • _at_Id
  • _at_Column(name "MANUFACTURER_ID", nullable
    false)
  • private Integer manufacturerId
  • _at_Column(name "NAME")
  • private String name

26
Introduction le fameux HelloWorld revisité
  • public class HelloWorld
  • public static void main(String... args)
  • System.out.printf("HelloWorld class start with
    d parameters !\n", args.length)
  • System.out.printf("printf function accept many
    parameters like C language\n")
  • int numerator 3, denominator 5
  • String staticText "Rational"
  • System.out.printf("My s is d/d\n",
    staticText, numerator, denominator)

27
Méthodes à nombre variable de paramètres
  • Identique à passer un tableau dobjets
  • Simple point de vue syntaxique
  • Permet de simplifier la syntaxe dappel vous ne
    construisez pas le tableau.
  • Le Main peut donc être vu comme une méthode à
    nombre variable de paramètres.
  • Exemple de méthode à nombre variable de
    paramètres printf

28
Méthodes à nombre variable de paramètres
  • public class Start
  • public static int minimum(int ... values) throws
    Exception
  • if (values.lengthlt1) throw new Exception("You
    must specified a value")
  • if (values.length 1) return values0
  • int mini values0
  • for(int i1 iltvalues.length i)
  • if (valuesiltmini) minivaluesi
  • return mini
  • public static int maximum(int ... values) throws
    Exception
  • if (values.lengthlt1) throw new Exception("You
    must specified a value")
  • if (values.length 1) return values0
  • int maxi values0
  • for(int i1 iltvalues.length i)
  • if (valuesigtmaxi) maxivaluesi
  • return maxi

29
Boxing et Unboxing
  • import java.util.
  • public class Start
  • public static void main(String args)
  • Integer monInt 3 // Boxing
  • System.out.println("monInt " monInt)
  • int i monInt // unboxing
  • System.out.println("---------------------------"
    )
  • Vector collection new Vector()
  • collection.addElement("Ceci est une chaine")
  • collection.addElement(new Date())
  • collection.addElement(3.2) // Boxing
  • collection.addElement(2)
  • Enumeration enume collection.elements()
  • while(enume.hasMoreElements())

30
Les types énumérés
  • import java.lang.reflect.
  • enum Feu
  • VERT,
  • ORANGE,
  • ROUGE
  • public class Start
  • public static void main(String args)
  • Feu feuCroisement Feu.VERT
  • System.out.println("feuCroisement "
    feuCroisement)
  • System.out.println("type de feuCroisement "
    feuCroisement.getClass())
  • Class clsFeu feuCroisement.getClass()
  • Field attributes clsFeu.getFields()
  • for(Field field attributes)
  • System.out.printf("Attribut s de type s\n",
  • field.getName(), field.getType()
Write a Comment
User Comments (0)
About PowerShow.com