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

 Java Discussion :

MouseDragged PaintComponent. Image qui suit la souris


Sujet :

Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 13
    Points : 11
    Points
    11
    Par défaut MouseDragged PaintComponent. Image qui suit la souris
    Bonjour,

    Je suis en ce moment sur un jeu d'echecs et j'aimerais trouver un moyen plus efficace que celui que j'utilise en ce moment pour que , lors d'un dragged d'une piece d'echecs (image) avec la sourie, celle-ci suive la sourie jusqu'a ce que l'evenement MouseReleased survienne.

    Pour le moment, j'utilise les coordonnées dans la méthode Mouseclick pour récupérer l'image de la piece, puis, dans la methode MouseDragged, j'appel la methode repaint() , qui affiche le plateau de Jeu (IMAGE) , toutes les pieces de l'echiquier présentes (IMAGES) puis la piece (IMAGE) à la position précisé par MouseDragged.
    Ainsi j'ai bien ce que je veux , mais avec cette méthode, l'image de la piece suit la sourie avec un grand temps de latence (car je fais des calculs pour les pieces et le plateau).

    N'y a t'il pas une méthode moins triviale afin que l'image suive la sourie, sans laisser de trace sur le plateau biensûr, mais ce instantanément ou presque?

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2009
    Messages : 57
    Points : 58
    Points
    58
    Par défaut
    Bonjour BaptisteTienko,

    J'ai déja eu a faire ce genre de chose plusieurs fois, et je crois avoir la réponse a ton probleme.

    tu affiche tes images dans des ImageIcon que tu associe a des JLabel ou des JPanel par exemple, c'est bien ça? ou alors tu dessine en Graphics toute ta table et tes images de pions?

    Une fois que tu m'araus donné cette indication, je pourrait être précis dans la réponse

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 13
    Points : 11
    Points
    11
    Par défaut Bonjour
    Mon code sera plus explicite je pense. Voici mon objet PanelEchiquier que j'ajoute indépendamment à un JPanel du JFrame de jeu:

    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
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
     
    private class PanelEchiquier extends JPanel implements MouseListener, MouseMotionListener{
     
            private Point mousePressed,mouseReleased,mouseDragged;
            private Image ImgPieceDragged;
     
            PanelEchiquier(){
                super();
                this.setPreferredSize(DIMENSION_PLATE);
                this.setBackground(Color.white);
                this.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 0, ColorBorder));
                this.addMouseListener(this);  
                this.addMouseMotionListener(this);
                mousePressed = new Point();
                mouseReleased = new Point();
                mouseDragged = new Point();
                ImgPieceDragged = null;
            }
     
            @Override
            public void paintComponent(Graphics g){
                paintPlateGame(g);
                paintPiecesChess(g);
                paintImageIconPieceDragged(g);
            }
            private void paintPlateGame(Graphics g){
                String CibleImgPlate;
                if("blanc".equals(ConfigPlayer.color)){
                    CibleImgPlate = staticInclude.CIBLE_IMG_PLATE_WHITE_BASIC;
                }else{
                    CibleImgPlate = staticInclude.CIBLE_IMG_PLATE_BLACK_BASIC;
                }
                try {
                    g.drawImage(ImageIO.read(new File(CibleImgPlate)),
                                0,
                                0,
                                DIMENSION_PLATE.width, 
                                DIMENSION_PLATE.height,
                                this);
                } catch (IOException ex) {
                    JOptionPane.showMessageDialog(null,"Impossible de charger l'image " + staticInclude.CIBLE_IMG_PLATE_WHITE_BASIC
                                                        + ".\n Verifiez que vous avez bien installé SNChessPlayer.","Fichier manquant",2);
                }
            }
            private void paintPiecesChess(Graphics g){
                if("blanc".equals(ConfigPlayer.color)){
                    for(int i=0;i<8;i++){
                        for(int j=0;j<8;j++){
                            ImageIcon PieceImage = MainPlateChess.Plate[i][j].getImageIcon();
                            if(PieceImage!=null)
                                g.drawImage(PieceImage.getImage(),
                                            DIMENSION_PIECES.width * j + 20,
                                            DIMENSION_PLATE.height - ((1 + i) * DIMENSION_PIECES.height) - 20,
                                            DIMENSION_PIECES.height, 
                                            DIMENSION_PIECES.width,
                                            this);
                        }
                    }
                }else{
                    for(int i=0;i<8;i++){
                        for(int j=0;j<8;j++){
                            ImageIcon PieceImage = MainPlateChess.Plate[i][j].getImageIcon();
                            if(PieceImage!=null)
                                g.drawImage(PieceImage.getImage(),
                                            DIMENSION_PLATE.width - DIMENSION_PIECES.width * (j+1),
                                            DIMENSION_PIECES.height * i,
                                            DIMENSION_PIECES.height, 
                                            DIMENSION_PIECES.width,
                                            this);
                        }
                    } 
                }   
            }
            private void paintImageIconPieceDragged(Graphics g){
                if(ImgPieceDragged==null)
                    return;
                g.drawImage(
                        ImgPieceDragged,
                        mouseDragged.x - DIMENSION_PIECES.width / 2,
                        mouseDragged.y - DIMENSION_PIECES.height / 2,
                        DIMENSION_PIECES.height, 
                        DIMENSION_PIECES.width,
                        this);
     
            }
            public void mouseClicked(MouseEvent e) {               
             }
            public void mouseReleased(MouseEvent e) {
                if("blanc".equals(ConfigPlayer.color)){
                    mouseReleased.x = (( (e.getX() - 20) / DIMENSION_PIECES.width ));
                    mouseReleased.y   = (7-(e.getY() / DIMENSION_PIECES.height));
     
                }else{
                    mouseReleased.x = (7-( ( e.getX()-20) / (DIMENSION_PIECES.width) )) ;
                    mouseReleased.y   = ((e.getY() / DIMENSION_PIECES.height));
                }
                movePiece_withinClick();
            }
            public void mousePressed(MouseEvent e) {
                 if("blanc".equals(ConfigPlayer.color)){
                    mousePressed.x = (( (e.getX() - 20) / DIMENSION_PIECES.width ));
                    mousePressed.y   = (7-(e.getY() / DIMENSION_PIECES.height));
     
                }else{
                    mousePressed.x = (7-( ( e.getX()-20) / (DIMENSION_PIECES.width) )) ;
                    mousePressed.y   = ((e.getY() / DIMENSION_PIECES.height));
                }
                if(mousePressed.x>=0 && mousePressed.x<=7){
                    if( mousePressed.y>=0 && mousePressed.y<= 7){
                        ImgPieceDragged = MainPlateChess.Plate[mousePressed.y][mousePressed.x].getImageIcon().getImage();
                    }
                }
            }
            public void mouseEntered(MouseEvent e) {
                setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
            }
            public void mouseExited(MouseEvent e) {
                setCursor(Cursor.getDefaultCursor());
            }
            public void mouseDragged(MouseEvent e) {
                mouseDragged.x = e.getX();
                mouseDragged.y = e.getY();
                repaint();
            }
            public void mouseMoved(MouseEvent e) {
     
            }
            private void movePiece_withinClick(){
                if(mousePressed.x>=0 && mousePressed.x<=7){
                    if( mousePressed.y>=0 && mousePressed.y<= 7){
                        if(mouseReleased.x >= 0 && mouseReleased.x <=7){ 
                            if(mouseReleased.y >=0 && mouseReleased.y <=7){
                                ChessStrategy.movePiece_byUser(new Point(mousePressed.y, mousePressed.x),new Point(mouseReleased.y , mouseReleased.x));
                                repaint();   
                            }
                        }
                    }
                }
                ImgPieceDragged = null;
            }
     
        }
    Merci de ton aide

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Je viens de lire par un modo ceci:
    il ne faut jamais faire de traitement lourd dans cette méthode (PaintComponent()), donc ne jamais y charger une image à partir d'un disque. Tu dois le faire une fois pour toute dans le constructeur.
    Alors je vais déjà essayer de suivre une règle d'or d'un expert et je te tien au courant.
    (Je veux comme même connaître une méthode plus avancé pour mon problème! )

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Je dois dire que le différence est flagrante! Je charge mes images au démarrage de l'application et c'est pas mal du tout!

    Mais ma curiosité est toujours assoifée, j'attend l'aide que tu m'a promis avec impatience!

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2009
    Messages : 57
    Points : 58
    Points
    58
    Par défaut
    Bonjour BaptisteTienko,
    Je viens de lire vite fait le code, je le relirai plus en detail tout a l'heure (je suis au boulot), mail il y a quelques petites remarques et questions que j'aimerai te poser:

    - Tu considere que ton echiquier, ainsi que toutes tes pieces sont des images, que tu redessine a chaque fois qu'il y a un mouvement ou une interraction? en gros, la methode "paintComponent" (ou "paint") redessine a chaque fois le nouvel état? Pourquoi tu ne creerais pas plutot une Classe Echiquier (JPanel) dans laquelle tu charge une fois pour toute l'image de ton echiquier, et aussi une Classe "Piece" (JPanel aussi, ou meme JLabel), dans laquelle tu charge aussi les images des pieces associée une fois pour toute, et dans laquelle tu spécifie des attribut (type de piece: pion, tour, ...., couleur: blanc, nouir, ....). tu tireras plus d'avantage de la POO de cette façon, et ça te facilitera les manipulations et les deplacements. Sans oublier que tu n'aura plus besoin de faire appel a des "repaint()" puisque un "setLocation(x,y)" d'une de tes piece (qui serait un JPanel ou JLabel) ferait tout ce qu'il faut?

    Comme je te l'ai dit, je vais regarder ton code plus en detail tout a l'heure, mais si ça t'interesse, je pourrait te faire un nouveau code qui ferait ce que tu veux, et tu jugera si ça t'interesse ou pas?

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    salut looclooc,

    J'utilise effectivement, et heureusement, un objet Piece et un objet Echiquier, ce que tu n'a pas vu apparemment dans mon code^^ ...

    La position des pièces étant définies par un autre objet, un tableau 2D 8x8, qui contient les références de chaque pieces.

    Donc les images des pieces sont chargées dès l'initialisation du plateau de Jeu et une seul fois.
    Seulement, une autre classe Strategie fait les calculs de déplacements, déplace en mémoire et uniquement en mémoire dans le tableau 2D les références des pieces.
    Je dois donc faire appel à la méthode repain() de mon objet Echiquier après un déplacement, d'où l'obligation de parcourir mon tabeau 2D.

    Mais là n'est pas le problème^^!

  8. #8
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Alors, parmis les ameliorations possibles :
    • Utiliser des BufferedImage compatibles ce qui ameliorera les performances d'affichage, voir la .
    • Lorsque tu fais un deplacement, tu appelles repaint() uniquement sur une sous-zone correspondant aux parties a repeindre (voir les variantes de cette methode).
    • En contrepartie, dans le paintComponent() et ses sous-methodes, tu testes l'intersection de la zone de clip du Graphics et des boites englobantes de tes images ou autres objets pour eviter de peindre des choses qui sont en dehors de cette zone de clip (et donc qu'il n'est pas necessaire de repeindre : faire des tests de collision est bien plus rapide que de peindre a l'ecran).


    PS : avoir plein de petits JPanel pour representer les pieces, etc. est une maniere de faire mais pas forcement la meilleure et ni la moins gourmande en ressources... D'un autre cote cela t'evites de devoir recoder la meme chose a la main toi-meme...
    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

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Merci pour toutes ces précisions, je vais me renseigner.

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

Discussions similaires

  1. Aiguille de Boussole qui suit la souris
    Par HWICE dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 22/08/2008, 17h03
  2. probleme de zone qui suit la souris
    Par taekwon dans le forum Flash
    Réponses: 6
    Dernier message: 29/04/2008, 18h55
  3. objet qui suit la souris
    Par eveilside dans le forum Flash
    Réponses: 1
    Dernier message: 25/05/2007, 10h55
  4. DragDrop faire un shape qui suit la souris
    Par matech dans le forum Langage
    Réponses: 9
    Dernier message: 15/04/2006, 18h41
  5. Fenêtre (sorte de popup) qui suit la souris en onmouseover
    Par yoyot dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 09/03/2005, 09h52

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