IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

2D Java Discussion :

[java2d] Animation


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2004
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 32
    Par défaut [java2d] Animation
    Bonjour

    J'essaie de creer une animation simple.

    Il s'agit d'un rectangle qui se deplace vers la droite lorsque j'appuie sur la fleche de droite.

    J'ai donc creer trois classes :

    1 -> Principale Qui est mon JFrame contenant ma methode paint

    2 -> Deplacement Qui est mon ecouteur d'evenement

    3 -> Raquette Qui est mon rectangle a déplacer.


    Ma classe Principale ( J'ai supprimer les imports ... )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    public class Principale extends JFrame {
     
        public Raquette r = new Raquette(100,450);
     
        /** Creates a new instance of Principale */
        public Principale() {
     
            super("testJava2D");
            this.setVisible(true);
            this.setSize(500, 500);
     
            this.getContentPane().add(new GuiJeu());
            this.addKeyListener(new Deplacement(this));
        }
            public void paint(Graphics g){
     
            Graphics2D g2 = (Graphics2D)g;
            r.dessiner(g2);
     
        }
     
        public static void main(String [] argv){
            new Principale();
        }
    }

    Et ma classe Raquette

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    public class Raquette {
     
        public int x;
        public int y;
     
        /** Creates a new instance of Raquette */
        public Raquette(int x,int y) {
            this.x = x;
            this.y = y;
     
        }
     
        public void dessiner(Graphics2D g){
     
            Shape r = new Rectangle2D.Float(x,y,200,20);
            g.draw(r);
        }
     
    }
    Apres avoir vu mains tutoriels je n'arrive pas a trouver ce qui ne vas pas ...

    Le probleme est que l'affichage ne se renouvelle pas. Lorsque mon rectangle se deplace, la trace de l'ancien reste sur le JFrame ..


    Est ce parceque j'utilise un Graphics2D ?

    merci ..

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Par défaut
    Bonjour,

    Quel est le contenu de la classe Deplacement ?

    Nicolas

  3. #3
    Membre averti
    Inscrit en
    Octobre 2004
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 50
    Par défaut
    pour ma pars je ne dessinerais pas directement sur la frame mais sur un panel
    mais bon ca doit pas changer grand chose

    au debut de la methode repaint il faut reinit l'affichage par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    g.setColor(Color.white);
    g.fillRect(0,0,getwidth(),getHeigh());
    pour que la trace de l'ancien repaint disparait

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Par défaut
    Mabs, je ne suis pas trop d'accord. Normalement, si le code est bien conçu, il suffit de modifier les coordonnées de la raquette et de repaint() : pas besoin de repasser en blanc sur l'ancienne trace.

    Nicolas

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Par défaut
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
     
    public class TerrainDeJeu extends JComponent {
     
        private int xPositionRaquette = 240;
        private int yPositionRaquette = 240;
     
        public void moveToRight() {
            xPositionRaquette += 10;
            repaint();
        }
        public void paint(Graphics g) {
            Graphics2D g2 = (Graphics2D) g;
            g2.drawRect(xPositionRaquette, yPositionRaquette, 20, 20);
        }
     
        public static void main(String[] args) {
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(500, 500);
            final TerrainDeJeu tdj = new TerrainDeJeu();
            // final ci-dessus pour avoir accès à tdj dans le listener interne ci-dessous
            frame.getContentPane().add(tdj);
            frame.addKeyListener(new KeyAdapter() {
                public void keyPressed(KeyEvent ke) {
                    if (ke.getKeyCode() == KeyEvent.VK_RIGHT) {
                        tdj.moveToRight();
                    }
                }
            }
            );
            frame.setVisible(true);
        } 
    }
    Nicolas

  6. #6
    Membre averti
    Inscrit en
    Janvier 2004
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 32
    Par défaut
    Merci pour vos reponses ..

    J'ai donc rajoute les lignes que Mabs a conseillé et ca fonctionne parfaitement

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Par défaut
    Même si ton application "fonctionne", je crains qu'elle ne souffre d'un problème d'utilisation de l'API 2D. Cf. posts précédents.
    EDIT: Si par exemple, la raquette passe sur un décor de fond, elle va progressivement l'effacer.

    Nicolas

  8. #8
    Membre averti
    Inscrit en
    Janvier 2004
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 32
    Par défaut
    Mais pourquoi est ce que G la trace de la raquette precedente.. L'affichage ne se renouvelle pas ?

    C tres ennuyeux.

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Par défaut
    Je pense que tu as dû faire une petite erreur de programmation.

    Le code que je t'ai envoyé (ci-dessus) n'oblige pas à "effacer" l'ancienne trace de la raquette : Java s'occupe de tout, en redessinant l'ensemble comme il faut. L'as-tu essayé ?

    Si tu postes ton code, nous pourrons essayer de voir où est le problème.

    Nicolas

  10. #10
    Membre averti
    Inscrit en
    Janvier 2004
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 32
    Par défaut
    Voici le code :

    Il comporte deux packages : gui et controlleur

    gui

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    /*
     * Principale.java
     *
     * Created on 4 juin 2005, 01:39
     */
     
    package testjava2d.gui;
     
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.RenderingHints;
    import java.awt.Shape;
    import java.awt.geom.Rectangle2D;
    import javax.swing.JFrame;
    import testjava2d.controleur.Deplacement;
     
    /**
     *
     * @author HP_Administrateur
     */
    public class Principale extends JFrame {
     
     
        public Raquette r = new Raquette(100,450);
     
        /** Creates a new instance of Principale */
        public Principale() {
     
            super("testJava2D");
            this.setVisible(true);
            this.setSize(500, 500);
     
            this.getContentPane().add(new GuiJeu());
            this.addKeyListener(new Deplacement(this));
     
        }
        public void paint(Graphics g){
     
            Graphics2D g2 = (Graphics2D)g;
            r.dessiner(g2);
     
        }
     
        public static void main(String [] argv){
            new Principale();
        }
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    /*
     * Principale.java
     *
     * Created on 4 juin 2005, 01:39
     */
     
    package testjava2d.gui;
     
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.RenderingHints;
    import java.awt.Shape;
    import java.awt.geom.Rectangle2D;
    import javax.swing.JFrame;
    import testjava2d.controleur.Deplacement;
     
    /**
     *
     * @author HP_Administrateur
     */
    public class Principale extends JFrame {
     
     
        public Raquette r = new Raquette(100,450);
     
        /** Creates a new instance of Principale */
        public Principale() {
     
            super("testJava2D");
            this.setVisible(true);
            this.setSize(500, 500);
     
            this.getContentPane().add(new GuiJeu());
            this.addKeyListener(new Deplacement(this));
     
        }
        public void paint(Graphics g){
     
            Graphics2D g2 = (Graphics2D)g;
            r.dessiner(g2);
     
        }
     
        public static void main(String [] argv){
            new Principale();
        }
    }
    controlleur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    /*
     * Deplacement.java
     *
     * Created on 4 juin 2005, 01:35
     */
     
    package testjava2d.controleur;
     
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import testjava2d.gui.Principale;
     
    /**
     *
     * @author HP_Administrateur
     */
    public class DeplacementRaquette implements KeyListener {
     
        Principale p;
        public DeplacementRaquette(Principale p){
            this.p = p;
        }
     
        public void keyReleased(KeyEvent e){
     
        }
        public void keyPressed(KeyEvent e){
            if(e.getKeyCode()==KeyEvent.VK_RIGHT) {
                p.r.x = p.r.x + 10;
                p.repaint();
            }
     
            if(e.getKeyCode()==KeyEvent.VK_LEFT){
                p.r.x = p.r.x - 10;
                p.repaint();
            }
     
        }
        public void keyTyped(KeyEvent e){
            System.out.println("test");
        }
    }
    Le code n'as rien de compliquer ... J'espere trouver ce qui ne va pas ..

  11. #11
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Par défaut
    J'imagine que Deplacement dans Principale est à remplacer par DeplacementRaquette ?

    Peux-tu poster aussi GuiJeu ?

    Nicolas

  12. #12
    Membre averti
    Inscrit en
    Janvier 2004
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 32
    Par défaut
    y a rien dans GuiJeu ca existe plus. Y a que ces trois classes

  13. #13
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Par défaut
    Apparemment, cela va mieux en ne dessinant pas directement sur la JFrame, mais sur un JComponent à incorporer dans la JFrame.

    (Par ailleurs, il y a probablement des modifications à faire dans ton code sur l'accès aux champs internes des classes. A mon avis, moins de champ "public", et plus de méthode get/set/modify).

    Ton code modifié:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.geom.Rectangle2D;
    import javax.swing.*;
     
    class Raquette {
     
        public int x;
        public int y;
     
        /** Creates a new instance of Raquette */
        public Raquette(int x,int y) {
            this.x = x;
            this.y = y;     
        }
     
        public void dessiner(Graphics2D g){
            Shape r = new Rectangle2D.Float(x,y,200,20);
            g.draw(r);
        }
     }
     
    public class Principale extends JComponent {
     
        public Raquette r = new Raquette(100,450);
     
        public void paint(Graphics g){
            Graphics2D g2 = (Graphics2D)g;
            r.dessiner(g2);
        }
     
        public static void main(String [] argv){
            JFrame frame = new JFrame("testJava2D"); // MODIF
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // AJOUT
            Principale p = new Principale(); // AJOUT
            frame.getContentPane().add(p); // MODIF
            frame.addKeyListener(new DeplacementRaquette(p)); // MODIF
            frame.setSize(500, 500); // MODIF
            frame.setVisible(true); // MODIF
        }
    }
     
    class DeplacementRaquette implements KeyListener {
     
        Principale p;
     
        public DeplacementRaquette(Principale p){
            this.p = p;
        }
     
        public void keyReleased(KeyEvent e){
     
        }
        public void keyPressed(KeyEvent e){
            if(e.getKeyCode()==KeyEvent.VK_RIGHT) {
                p.r.x = p.r.x + 10;
                p.repaint();
            }
     
            if(e.getKeyCode()==KeyEvent.VK_LEFT){
                p.r.x = p.r.x - 10;
                p.repaint();
            }
        }
     
        public void keyTyped(KeyEvent e){
            System.out.println("test");
        }
    }

  14. #14
    Membre averti
    Inscrit en
    Janvier 2004
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 32
    Par défaut
    Effectivement Deplacement => DeplacementRaquette ....

    J'ai beau le relire je ne vois pas ce qui ne vas pas .



  15. #15
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Par défaut
    Euh... voir ci-dessus.
    (En cas de problème, modifier et faire des essais est souvent plus utile que relire ;-) [EDIT:] En particulier, si tu avais analysé mon code TerrainDeJeu qui fonctionnait mais dont tu n'as pas fait grand cas, et si tu l'avais comparé au tien, tu aurais vu que la seule différence de fond est qu'il dessine sur un JComponent et non une JFrame ;-) ).

    Nicolas

  16. #16
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2004
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 42
    Par défaut
    J'avais déjà vu un sujet dans le genre, cherches du côté du double buffering sur ce forum on sait jamais

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 98
    Par défaut
    Je debute totalement mais j'ai lu un truc à cette adresse :

    http://java.sun.com/products/jfc/tsc/articles/painting/

    qui dit en gros que Swing utilise pour assurer le rendu des "composants légers" et qu'un composant léger utilise pour s'afficher le composant ancetre lourd le plus proche, cela implique que dans la méthode paint surchargée il faut faire appel à super.paint(g) cela évite d'avoir à effacer la raquette "manuellement".

    Evidemment non testé et sous toute réserve qu'un Newbie du swing ai compris correctement!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [appli][Java2D]Pb scintillement Animation
    Par ddams dans le forum 2D
    Réponses: 2
    Dernier message: 25/04/2003, 11h57
  2. Comment ne pas rejouer une animation après un clic ?
    Par mmmmhhh dans le forum ActionScript 1 & ActionScript 2
    Réponses: 4
    Dernier message: 04/09/2002, 16h11
  3. [Composants][Animation] Lire une vidéo compressée
    Par femtosa dans le forum Composants VCL
    Réponses: 6
    Dernier message: 03/09/2002, 08h03
  4. Rx Controls Gif animés
    Par toufou dans le forum Composants VCL
    Réponses: 6
    Dernier message: 23/08/2002, 14h09
  5. Passage de parametre a une anim Flash 5
    Par debug dans le forum Intégration
    Réponses: 4
    Dernier message: 03/06/2002, 17h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo