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 :

peindre plusieurs images a la suite


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 3
    Par défaut peindre plusieurs images a la suite
    Bonjour a tous,
    ce post est mon premier sur ce forum, je souhaite de plus préciser que je suis un novice de la programmation Java.

    En gros voilà mon pb,
    je créer un petit jeu pour me faire la main.
    Mon programme est constitué d'une fenêtre qui intègre un panel a l'intérieur duquel je peint les éléments de mon jeu.

    Ma fenêtre dispose d'un KeyListener qui me sert a modifier mon panel. Un personnage ce déplace a l'intérieur de ce dernier et lorsque j'appuie sur 'p' je souhaite lui voir faire un coup d'épée.
    Ce faisant, depuis mon keylistener je modifie un booléen de mon panel et je repaint.
    Je change une première fois l'image a la position de mon personnage plus met le processus en pause en utilisant un thread. Puis une seconde image avec un temps de pause.
    Enfin je refait passer mon booléen a sa valeur initiale pour stopper l'animation du coup d'épée et le jeu peut ainsi reprendre son cour.

    Ci-contre : le code de mon "coup d'épée" :

    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
    if (coup == true) { // coup d'épée
     
    							g.setColor(Color.white);
    							g.fillRect(x, y, 30, 30);
    							g.drawImage(this.coup1, x, y, 30, 30, this);
    							System.out.println("coup1");
    							this.repaint();
    							try {
    								Thread.sleep(500);
     
    							} catch (InterruptedException e) {
    								// TODO Auto-generated catch block
    								e.printStackTrace();
    							}
     
    							g.setColor(Color.white);
    							g.fillRect(x, y, 30, 30);
    							g.drawImage(this.coup2, x, y, 30, 30, this);
    							System.out.println("coup2");
    							this.repaint();
    							try {
    								Thread.sleep(500);
     
    							} catch (InterruptedException e) {
    								// TODO Auto-generated catch block
    								e.printStackTrace();
    							}
     
    							coup = false;
     
    						}
    Le problème est le suivant :
    bien que testant le fait que mon programme exécute bien le paint de mes 2 images, ''l'animation" se fait a très grande vitesse pour un effet visuelle très moche (le fait de changer le temps de sleep ne change rien). De plus j'ai l'impression que la première image n'est jamais peinte...

    Peut être que je n'utilise pas les bonne méthode ? la logique de mon code est elle bonne ? Si des personnes plus aguerris que moi peuvent me donner une piste a suivre ou n'importe quels conseils utiles...

    Merci d'avance !!

  2. #2
    Membre Expert Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Par défaut
    Pour ton problème, sépare ton Thread et ton paintComponent. Et utilise un int pour la progression de ton coup d'épée.
    Voila un petit exemple. En espérant que je l'ai bien fait. J'espère qu'il t'inspirera.
    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
    70
    71
    72
    73
    74
    75
    76
    77
    78
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    /**
     *
     * @author Ivelios
     */
    public class CoupEpee extends JPanel implements Runnable{
     
     
        private int coup = 0;//Progression du coup
        private boolean coupEnCours;//Le joueur est en train de faire un coup
     
        public CoupEpee(){
            super();//Appel du constructeur de JFrame;  super("titre") pour mettre le titre
            this.setLayout(null);
     
            //La fenêtre
            JFrame f = new JFrame("frame");
            f.setSize(200,200);
            f.setResizable(false);
            f.setLocationRelativeTo(null);
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
            //Le boutton
            JButton action = new JButton("Action");
            action.setBounds(100, 100, 70, 35);
            action.addActionListener(new ActionListener(){
                 public void actionPerformed(ActionEvent e) {
                    if(!CoupEpee.this.coupEnCours)//Si aucun coup n'est en cours
                        new Thread(CoupEpee.this).start();//Démarrage du coup d'épée
                }
            });
     
            this.add(action);
            f.setContentPane(this);
            f.setVisible(true);
        }
     
     
         public void paintComponent(Graphics g) {
            super.paintComponent(g);
            //Arrière plan
            g.setColor(Color.DARK_GRAY);
            g.fillRect(0, 0, 400, 400);
     
            //Le coup d'épée
            g.setColor(Color.white);
            if (coup == 1) g.fillRect(10, 10, 30, 30);
            else if(coup == 2) g.fillRect(10, 50, 30, 30);
            else if(coup == 3) g.fillRect(10, 90, 30, 30);
            else if(coup == 4) g.fillRect(10, 130, 30, 30);
     
            }
     
     
        public void run() {
            //Début du coup
            coupEnCours = true;
            //Progression du coup et actualisation du panel
            for(int i =1;i<5;i++){
                coup = i;
                this.repaint();
                try {Thread.sleep(300);} catch (InterruptedException e) {}
            }
            //Fin du coup
            coup = 0;
            this.repaint();
            coupEnCours = false;
        }
     
        /** Lanceur */
        public static void main(String[] args){ new CoupEpee();}
    }

  3. #3
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 904
    Billets dans le blog
    54
    Par défaut
    Vous vous y prenez mal !

    Il ne faut pas faire des animations en Swing ou AWT en utilisant des Thread externes. Vous pouvez soit :
    - utiliser un Timer swing (javax.swing.Timer) pour permettre de faire l'animation durant l'EDT. Il est possible avec cette classe d'effectuer des actions a intervalles reguliers (changer la position de l'epee) tout en respectant l'EDT.
    - utiliser le swing time framework (https://timingframework.dev.java.net/) ou trident (http://kenai.com/projects/trident/pages/Home) qui eux sont des vrais framework d'animation/timing pour GUI/rendu graphique dans l'EDT.
    - utiliser une Thread externe pour changer le temps du "monde" et demander un repaint de l'affichage. Ce repaint lui aura lieu durant l'EDT et il changera la position de l'epee en fonction du temps actuel et de l'action en cours. C'est plus complique mais ce genre de gestion globale du temps dans le "monde" du jeu est plus courante de nos jours. Le code d'Ivelos s'en rapproche mais il peut etre plus approprier de decoucler la partie graphique de la partie non-graphique (quoi que pour un petit projet ce n'est peut-etre pas necessaire).
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 4
    Par défaut
    Citation Envoyé par bouye Voir le message
    - utiliser une Thread externe pour changer le temps du "monde" et demander un repaint de l'affichage. Ce repaint lui aura lieu durant l'EDT et il changera la position de l'epee en fonction du temps actuel et de l'action en cours. C'est plus complique mais ce genre de gestion globale du temps dans le "monde" du jeu est plus courante de nos jours. Le code d'Ivelos s'en rapproche mais il peut etre plus approprier de decoucler la partie graphique de la partie non-graphique (quoi que pour un petit projet ce n'est peut-etre pas necessaire).
    Ceci dit, c'est une bonne initiative à prendre le plus tôt possible, quelque soit la grandeur du projet

Discussions similaires

  1. Affichage de plusieurs images à la suite
    Par enymon dans le forum Android
    Réponses: 6
    Dernier message: 10/12/2011, 15h48
  2. [ImageMagick] Générer une image à partir de plusieurs images ?
    Par fichtre! dans le forum Bibliothèques et frameworks
    Réponses: 8
    Dernier message: 16/02/2005, 15h32
  3. [DirectDraw7] Affichage de plusieurs image bmp
    Par SteelBox dans le forum DirectX
    Réponses: 3
    Dernier message: 24/04/2004, 19h00
  4. [.bat][FOR][IF]executer plusieurs commandes a la suite
    Par ¤FRIX¤ dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 23/03/2004, 09h24
  5. Economie de mémoire pour plusieur images avec la même source
    Par neness dans le forum Composants VCL
    Réponses: 5
    Dernier message: 18/01/2004, 10h56

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