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 :

Faire une image qui se déplace


Sujet :

2D Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 11
    Points : 7
    Points
    7
    Par défaut Faire une image qui se déplace
    Bonjour , J'aimerai faire un jeu de plateau et je me retrouve confronté à un problème

    Dans un premier temps j'aimerai que l'utilisateur puisse cliquer sur un pion, puis cliquer sur un point sur l'écran et qu'il voit le pion se déplacer de sa position initiale au point choisit !

    Mes problemes :
    -comment savoir quel pion a été selectionné , j'ai voulu essayé avec des getSource() mais je n'y suis pas arrivé

    -Quand le pion se deplace, il apparait directement à sa position final !
    (surement un probleme de rafraichissement mais si j'essai de mettre un timer dans ma boucle for le thread s'arrete ne raffraichit donc pas !

    ma fonction de deplacement:
    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
    private void mouve(int orix,int oriy,int destx,int desty,int gpid){
     
    /*gpid estl'id du pion*/
     
          float coeff=(float)(desty-(oriy+25))/(float)(destx-(orix+25));
    /*Pour le deplacement je considere une fonction linéaire donc je calcul le coeff directeur*/
     
          if(desty<oriy) coeff=coeff*-1;
          if(orix<destx)
                for(int i=orix;i<destx;i++) {
                pipi[gpid].setX(i);
                pipi[gpid].setY((int)(coeff*i));
                System.out.println("x:"+pipi[gpid].getX()+"y:"+pipi[gpid].getY());
                repaint();
               }
          else 
              for(int i=orix;destx<i;i--) {
                pipi[gpid].setX(i);
                pipi[gpid].setY((int)(coeff*i));
                System.out.println("x:"+pipi[gpid].getX()+"y:"+pipi[gpid].getY());
                repaint();
              }
     
                }
    ma class Gpion
    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
    public class Gpion implements MouseListener{
     
        public Image im=Toolkit.getDefaultToolkit().getImage("repos.png");
        public int x,y;
        /** Creates a new instance of Gpion */
           public Gpion() {
     
            this.im=Toolkit.getDefaultToolkit().getImage("repos.png");
        }
     
        public Gpion(int a,int b) {
         this.x=a;
         this.y=b;
            this.im=Toolkit.getDefaultToolkit().getImage("repos.png");
        }
     
     
        public int getX(){
            return this.x;
        }
     
        public int getY(){
            return this.y;
        }
        public void setX(int a){
            x=a;
        }
     
        public void setY(int a){
            y=a;
        }
     
         public Image getIm(){
            return Toolkit.getDefaultToolkit().getImage("repos.png");
        }
        public void setIm(Image i){
            im=i;
    }
     
        public void mouseClicked(MouseEvent e) {
            System.out.println(e.getSource());
        }
    }
    Merci d'avance !!!

  2. #2
    Membre éclairé
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Points : 844
    Points
    844
    Par défaut
    Citation Envoyé par aurelien94
    -Quand le pion se deplace, il apparait directement à sa position final !
    (surement un probleme de rafraichissement mais si j'essai de mettre un timer dans ma boucle for le thread s'arrete ne raffraichit donc pas !
    Ta boucle déplacant le pion doit s'executer dans un autre Thread que l'EDT (Event Dispach Thread).
    Ce thread pourra effectuer des "Sleep" sans broncher et redessiner ton pion se déplacant.

  3. #3
    Membre expérimenté Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Points : 1 544
    Points
    1 544
    Par défaut
    pour faire ca y a un excellent tuto de Gfx sur le drag n drop, qui correspond a ce que tu veux faire

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    C'est pas exactement du drag n drop que je veux faire justement ^^' .
    Vu que l'utilisateur de voir le pion bougé tt seul

  5. #5
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Grosso modo un timer, une equation affine et du dessin sur le GlasspPane de ta JFrame devrait faire l'affaire.

    Il suffit juste que tu ressortes tes cours de maths de
    3eme ou 2nde pour calculer l'equation d'une droite à partir de deux points (le point de depart et l'arrivée).

    Grosso modo tu vas créer une classe héritant de JComponent dans la quelle tu redéfiniras la méthode paintComponent pour qu'elle dessine une image à un endroit précis.

    Dans cette classe tu auras pour membres un javax.swing.Timer, une BufferedImage, un entier pour l'absisse et un pour l'ordonnée de départ, et de même pour la destination.

    Puis lorque tu actives le timer tu commence à dessiner l'image et à chaque passage dans la méthode paintComponent tu incrémentes x, déduis y depuis x avec l'equation et redessine l'image à la bonne place.

    Une fois l'image arrivée à detination tu fais en sorte que le composant ne dessine plus rien....

    Ce composant remplacera le GlassPane de ta JFrame avec la méthode setGlassPane de celle ci.

    Et pour comprendre comment faire joujou avec un timer et le glasspane, vas voire le tuto Attendre avec style de Gfx toujours

  6. #6
    Membre expérimenté Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Points : 1 544
    Points
    1 544
    Par défaut
    n'empeche que dans le tuto sus mentionné, il y a toute une partie sur le création de glassPane, avec l'image de l'objet sourcedessus, bon a adapté car elle se deplace sous la souris, mais je te conseille d'y jeter un oeil (pas trop fort bien sur)

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    La méthode de divxdede a bien marché en mettant ma boucle for dans un new thread on voit bien le pion bougé . Puis avec un timer je peux géré la vitesse du pion Mais j'ai l'impression que mon thread s'arrete jamais :s et je sais pas comment mettre monthread.stop(); que quand le pion est arrivé à destination.

    Mais je pense que je vais me tourner vers la solution du GlassPane qui me permetterait de bloquer toutes les actions possibles pendant le déplacement du pion .

    Pour l'équation d'une equation affine il y avait rien de difficile

    Mais comment faire ca :
    Une fois l'image arrivée à detination tu fais en sorte que le composant ne dessine plus rien....

  8. #8
    Membre confirmé Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Points : 552
    Points
    552
    Par défaut
    Un trhead se kill tout seul. Quand il a terminé sa méthode run(), il n'existe plus.

  9. #9
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Tu as juste un boolean dans ton composant disant si tu dois dessiner ou pas et ensuite dans ton paintComponent tu verifie l'état de ce booleen suivant la valeur tu executes du code ou pas

  10. #10
    Membre éclairé
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Points : 704
    Points
    704
    Par défaut
    pourquoi travailler sur le glasspane ?

    le contentpane devrait quand meme suffire. non?

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    pourquoi travailler sur le glasspane ?

    le contentpane devrait quand meme suffire. non?
    Je me posais la meme question

  12. #12
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 851
    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 851
    Points : 22 863
    Points
    22 863
    Billets dans le blog
    51
    Par défaut
    A priori, je dirai eviter d'integrer une logique d'animation, dans un element reserve a une logique d'affichage et d'edition. De plus comme ca pas besoin de bidouiller la methode d'affichage du contentPane pour le calcul des zone a redessiner, etc... mais c'est juste une supposition d'un lundi pas fraichement reveille.

  13. #13
    Membre éclairé
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Points : 704
    Points
    704
    Par défaut
    c'es un jeu de plateau. y'a pas d'edition. :-)

    seulement ca me parait bizzare. j'aurais (moi) tout fais sur le contentPane. c'etait juste une question comme ca.

    merci quand meme pour cette explication (meme si je suis pas encore convaincu )

  14. #14
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 851
    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 851
    Points : 22 863
    Points
    22 863
    Billets dans le blog
    51
    Par défaut
    De toute maniere c'est juste une supposition lancee sans trop connaitre les details du jeu en question. Moi j'y vois certains avantages comme d'eviter d'avoir a calculer soi-meme des "dirty regions" pour optimiser l'affichage, mais je peux me tromper.

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Qu'est ce que les "dirty regions" ?

    J'ai un autre probleme, j'ai plusieur pions sur mon plateau.
    Et j'aimerai que d'un click sans faire 36 comparaisons ,avoir l'id du pion.
    Donc je fait un tableau de pion l'id representé par l'indice du tableau.
    Et j'aimerai rajoute un Listener sur mes pions .
    L'ennui c'est que quand je fais pion[i].addActionListener(.... ou .addMouseListener(...
    ben il cherche logiquement une methode dans ma class pion :s
    Comment faire ? Ma class pion doit etre une extends d'une class genre Jlabel et pour l'image j'utilise l'icon ? Y a t il une autre solution ?
    Merci .

  16. #16
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 851
    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 851
    Points : 22 863
    Points
    22 863
    Billets dans le blog
    51
    Par défaut
    Une "dirty region" (ou "region sale") c'est la zone minimale a reafficher en cas de modifications de l'image. Ce qui permet de n'avoir pas a redessiner entierement toute la zone de la fenetre/ecran et donc permet en general d'avoir un affichage plus rapide. Par fois quand le calcul de la dirty region est trop complexe, ou qu'elle est trop grande par rapport a la surface d'affichage, cela vaut mieux de reafficher completement l'ecran/fenetre cependant.

    La maniere la plus simple de mettre en place ce mecanisme est d'utiliser des boites englobantes rectagulaires pour les differents objets a l'ecran, de calculer une boite englobante resultantes de tous les objets touches par l'animation et de faire de cette boite la zone de clip du Graphics (setClip()). Lors d'un rendu seules les modifications apportees a l'interieur de la zone de clip sont repercutees sur le dessin.

    Definie-toi une classe Actor qui contient un sprite (image), une boite englobante rectangulaire, un point de reference et une ID. Et fait que Pion derive de cette classe, avec en plus des methodes liees au mecanisme du jeu. Avoir des boites englobantes permet de faciliter, entre autre, la detection du pion sur lequel on a clique. Si on a un match, alors on verifie plus en avant si on est effectivement sur le pion (en utilisant un bitmask par exemple ?).

    Pour le MouseListener ou l'ActionListener tu n'y couperas pas, ca sera sur le le JPanel qui affiche le jeu. De toute facon il est tres fortement lie a l'interface graphique construite par dessus le jeu et donc ne devrait pas directement interragir avec les entites du jeu meme.

    De toute maniere essaie de separer un minimum la logique d'affichage et la logique du jeu. Cela peut permettre plus tard d'avoir plusieurs sorties graphiques (AWT/Swing/SWT/2D/3D/distante) tout en gardant le meme moteur de jeu.

    Ca te ferai un minimum de 3 couches : JPanel (client local Swing) <=> moteur de jeu 2D (sprites et co) <=> logique du jeu.

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

Discussions similaires

  1. comment faire une cible qui se déplace sur un écran
    Par Mordenkainen dans le forum LabVIEW
    Réponses: 0
    Dernier message: 15/04/2011, 11h01
  2. Faire une image de son disque dur, puis restaurer cette imag
    Par cartonis dans le forum Autres Logiciels
    Réponses: 27
    Dernier message: 18/08/2005, 16h32
  3. Suppression de cadre autour d'une image qui sert de lien
    Par vasilov dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 03/04/2005, 13h02
  4. probléme de cadre sur une image qui me sert de lien
    Par thomas_chamas dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 26/11/2004, 17h36
  5. [VB6] Comment faire une fonction qui renvoie 2 résultats
    Par tazarine dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 15/01/2004, 00h13

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