Partage
  • Partager sur Facebook
  • Partager sur Twitter

Faire bouger une image

Sujet résolu
    21 mars 2015 à 18:13:43

    Bonjour,

    Actuellement en TS, je dois réaliser une projet en Python.

    Cependant j'aimerai pouvoir diriger mon personnage (créer à l'aide d'une image en .gif) à l'aide des touches directionnelles, à travers une pièce (aussi créer à l'aide d'une image en .gif), le tout inclus dans un canvas.

    Mais même après avoir créer une fonction cela ne fonctionne pas.

    Voici un aperçu du code que j'ai pour l’instant créer:

    from tkinter import*
    
    fen1=Tk()
    fen1.title('A light in the Darkness')
    
    
    
    def mouvement(event):
        global x,y,dx,dy
        touche = event.keysym
        if touche=="Right":
            x=x+1
        elif touche=="Left":
            x=x-1
    
    
    x=150
    y=560
    
    can1=Canvas(fen1,bg='white',width=1260,height=810)
    can1.pack(side=TOP, padx=5, pady=5)
    
    can1.focus_set()
    
    
    imagepiece1= PhotoImage(file="D:/02_ISN/Projet_RPG/___Coeur_du_jeu/images/piece1.gif") # image de la pièce
    can1.create_image(640,485,image=imagepiece1)
    
    personnage= PhotoImage(file="D:/02_ISN/Projet_RPG/___Coeur_du_jeu/images/HPdroit.gif") # Image du personnage
    can1.create_image(x,y,image=personnage)
    
    
    can1.bind("<Key>",mouvement)
    
    
    # Creation d'un bouton QUITTER, afin de pouvoir quitter le jeu a tout instant.
    bou1=Button(fen1, text='Quitter', command=fen1.destroy, relief=GROOVE, cursor="circle")
    quitter=PhotoImage(file='D:/02_ISN/Projet_RPG/___Coeur_du_jeu/bouton_quitter.gif')
    bou1.config(image=quitter,width=100,height=63)
    bou1.pack(side=RIGHT, padx=5, pady=5)
    
    
    fen1.mainloop() # demarrage du receptionnaire d'evenements
    #fen1.destroy() # destruction de la fenetre
    

    Merci de votre aide.

    • Partager sur Facebook
    • Partager sur Twitter
      21 mars 2015 à 18:36:19

      Salut

      As-tu bien vérifié que event.keysym renvoie bien "Right" et pas "<Right>" ou autre ?

      • Partager sur Facebook
      • Partager sur Twitter
        21 mars 2015 à 18:43:24

        J'ai étudié de nombreux programmes utilisant les touches directionnelles, mais je n'ai pas trouver d'explication claire concernant event.keysym, ni les conditions de son utilisation.

        Pour moi, il ne renvoie rien de spécial mais me permet d'utiliser les touches du clavier.

        Pourriez-vous m'expliquer l'utilisation de event.keysym, svp ?

        • Partager sur Facebook
        • Partager sur Twitter
          21 mars 2015 à 18:54:09

          Le event.keysym est bon. Ton problème est que tu changes les variables x et y, mais nulle part tu ne fais bouger le personnage. Il faut remettre à jour ses coordonnées avec les nouveaux x et y.

          -
          Edité par Dan737 22 mars 2015 à 10:20:32

          • Partager sur Facebook
          • Partager sur Twitter
            21 mars 2015 à 19:08:33

            Effectivement, merci, j'ai crée une fonction sans l'appeler. Les coordonnées du personnage ne sont donc pas à jour.

            Néanmoins le programme annonce un problème lorsque je rentre la variable x, qui est pourtant la seul modifié dans la fonction.

            • Partager sur Facebook
            • Partager sur Twitter
              22 mars 2015 à 10:23:52

              Oui mais même dans ta fonction mouvement, tu ne fais que changer les variable x et y. Ca ne va pas faire bouger l'image créée en ligne 30. Ce que tu dois faire c'est récupérer dans une variable ce que retourne la création de l'image: perso_id = can1.create_image(x, y, image=personnage). Grâce à cette variable, tu vas pouvoir changer ses coordonnées en faisant can1.coords(perso_id, new_x, new_y).

              -
              Edité par Dan737 22 mars 2015 à 10:24:51

              • Partager sur Facebook
              • Partager sur Twitter
                22 mars 2015 à 11:18:45

                D'accord, merci beaucoup

                Cependant cette fois-ci c'est la ligne touche = event.keysym qui bloque avec le message d'erreur "AttributeError: 'int' object has no attribute 'keysym' "

                • Partager sur Facebook
                • Partager sur Twitter
                  22 mars 2015 à 11:35:56

                  Comment appelles-tu mouvement ? Dans ton code fourni ici, c'est correct (ligne 33) et il passe bien un objet event. Il semblerait que tu appelles cette fonction en passant un int.

                  D'ailleurs je vois que dans ton message plus haut, tu dis que tu n'appelles pas cette fonction. Mais si! Tu l'appelles à chaque appuis de touche en ligne 33.

                  -
                  Edité par Dan737 22 mars 2015 à 11:37:06

                  • Partager sur Facebook
                  • Partager sur Twitter
                    22 mars 2015 à 11:52:50

                    Voici le programme avec quelques modifications cependant, il m'ouvre bien la fenêtre de mon jeu mais je ne peux toujours pas bouger mon personnage.

                    J'appelle la fonction mouvement avec la ligne can1.bind("<Key>",mouvement), et j'entre les nouvelles coordonnées à l'aide de la ligne can1.coords(perso_id,dx,y). Mais il a fallut que j'assigne à dx une valeur de départ (0) et mon personnage ce place donc pour dx=0 sans bouger malgré l'appelle de la fonction mouvement.

                    from tkinter import*
                    
                    fen1=Tk()
                    fen1.title('A light in the Darkness')
                    
                    def mouvement(event):
                        global x,y,dx,dy
                        touche = event.keysym
                        if touche=="Right":
                            dx=x+1
                        elif touche=="Left":
                            dx=x-1
                        return dx
                    
                    x=150
                    y=560
                    dx=0
                    
                    can1=Canvas(fen1,bg='white',width=1260,height=810)
                    can1.pack(side=TOP, padx=5, pady=5)
                    can1.focus_set()
                    
                    imagepiece1= PhotoImage(file="D:/02_ISN/Projet_RPG/___Coeur_du_jeu/images/piece1.gif")
                    can1.create_image(640,485,image=imagepiece1)
                    
                    
                    personnage= PhotoImage(file="D:/02_ISN/Projet_RPG/___Coeur_du_jeu/images/HPdroit.gif")
                    perso_id=can1.create_image(x,y,image=personnage)
                    
                    can1.bind("<Key>",mouvement)
                    can1.coords(perso_id,dx,y)
                    
                    
                    
                    fleche= PhotoImage(file="D:/02_ISN/Projet_RPG/___Coeur_du_jeu/images/FlecheH.gif")
                    can1.create_image(1050,780,image=fleche)
                    
                    
                    # Creation d'un bouton QUITTER, afin de pouvoir quitter le jeu a tout instant.
                    bou1=Button(fen1, text='Quitter', command=fen1.destroy, relief=GROOVE, cursor="circle")
                    quitter=PhotoImage(file='D:/02_ISN/Projet_RPG/___Coeur_du_jeu/bouton_quitter.gif')
                    bou1.config(image=quitter,width=100,height=63)
                    bou1.pack(side=RIGHT, padx=5, pady=5)
                    
                    
                    fen1.mainloop()
                    
                    



                    • Partager sur Facebook
                    • Partager sur Twitter

                    Faire bouger une image

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown