Partage
  • Partager sur Facebook
  • Partager sur Twitter

coordonnée, canevas

Sujet résolu
    1 juillet 2010 à 22:42:18

    Bonjour à tous, alors voila, mon problème est très simple: je n'arrive pas à comprendre les coordonnées d'une balle dans un canevas...

    Voici mon code:

    from tkinter import *
    
    # définition des gestionnaires
    # d'événements :
    
    def move():
        "déplacement de la balle"
        global x1, y1, dx, dy, flag,coul
        x1, y1 = x1 +dx, y1 + dy
        if x1 >210:
            can1.itemconfigure(oval1, fill= 'green')
            x1, dx, dy = 210, 0, 15
        if y1 >210:
            can1.itemconfigure(oval1, fill= 'blue')
            y1, dx, dy = 210, -15, 0
        if x1 <10:
            can1.itemconfigure(oval1, fill= 'yellow')
            x1, dx, dy = 10, 0, -15
        if y1 <10:
            can1.itemconfigure(oval1, fill= 'black')
            y1, dx, dy = 10, 15, 0
        can1.coords(oval1,x1,y1,x1+30,y1+30)
        if flag >0:
            fen1.after(10,move)
    
    
    
    
    def stop_it():
        "arret de l'animation"
        global flag    
        flag =0
    
    def start_it():
        "démarrage de l'animation"
        global flag
    
        if flag ==0:       # pour ne lancer qu'une seule boucle
         flag =1
         move()
    
        
    
    #========== Programme principal =============
    
    # les variables suivantes seront utilisées de manière globale :
    x1, y1 = 10, 10         # coordonnées initiales
    dx, dy = 15, 0          # 'pas' du déplacement
    flag =0                 # commutateur
    
    
    
    # Création du widget principal ("parent") :
    fen1 = Tk()
    fen1.title("Exercice d'animation avec Tkinter")
    # création des widgets "enfants" :
    can1 = Canvas(fen1,bg='dark grey',height=250, width=250)
    can1.pack(side=LEFT, padx =5, pady =5)
    oval1 = can1.create_oval(x1, y1, x1+30, y1+30, width=2, fill='red')
    bou1 = Button(fen1,text='Quitter', width =8, command=fen1.quit)
    bou1.pack(side=BOTTOM)
    bou2 = Button(fen1, text='Démarrer', width =8, command=start_it)
    bou2.pack()
    bou3 = Button(fen1, text='Arrêter', width =8, command=stop_it)
    bou3.pack()
    # démarrage du réceptionnaire d'évènements (boucle principale) :
    fen1.mainloop()
    



    Et voici mon exercice: Modifiez le programme de telle façon que la balle effectue des mouvements obliques comme une bille de billard qui rebondit sur les bandes (« en zig-zag »).

    Pour ça je dois comprendre ces coordonnées:
    x1, y1 = x1 +dx, y1 + dy
        if x1 >210:
            can1.itemconfigure(oval1, fill= 'green')
            x1, dx, dy = 210, 0, 15
        if y1 >210:
            can1.itemconfigure(oval1, fill= 'blue')
            y1, dx, dy = 210, -15, 0
        if x1 <10:
            can1.itemconfigure(oval1, fill= 'yellow')
            x1, dx, dy = 10, 0, -15
        if y1 <10:
            can1.itemconfigure(oval1, fill= 'black')
            y1, dx, dy = 10, 15, 0
    


    Si quelqu'un pouvait m'expliquer...

    (Je précise au passage que la balle change de couleur à chaque virage)
    • Partager sur Facebook
    • Partager sur Twitter
      1 juillet 2010 à 23:06:57

      x1 et y1 permettent de définir les coordonnées de la balle. Dans le cas présent, quand celui-ci sort des limite du canevas, on le fixe près du bord qu'il a atteint et on change la façon dont évolue ses coordonnées pour qu'il se déplace dans un autre sens (ce sont dx et dy qu'on incrémente à x1 et y1 à chaque appel de move).

      Donc c'est à dx et dy qu'il faudra toucher si on veut modifier la trajectoire de la balle.
      En s'assurant de rester cohérent, ça peut donner quelque chose comme ça:

      def move():
          "déplacement de la balle"
          global x1, y1, dx, dy, flag,coul
          x1, y1 = x1 +dx, y1 + dy
          if x1 >210:
              can1.itemconfigure(oval1, fill= 'green')
              x1, dx = 210, -dx # on modifie seulement une des coordonnées pour inverser le sens en cas de 
          if y1 >210:           # collision avec un bord
              can1.itemconfigure(oval1, fill= 'blue')
              y1, dy = 210, -dy  #Selon l'extremité atteinte ...
          if x1 <10:
              can1.itemconfigure(oval1, fill= 'yellow')
              x1, dx = 10, -dx
          if y1 <10:
              can1.itemconfigure(oval1, fill= 'black')
              y1, dy = 10, -dy
          can1.coords(oval1,x1,y1,x1+30,y1+30)
          if flag >0:
              fen1.after(10,move)
      
      #========== Programme principal =============
      
      # les variables suivantes seront utilisées de manière globale :
      x1, y1 = 10, 10         # coordonnées initiales
      dx, dy = 15, 3          # 'pas' du déplacement
      # On modifie aussi les valeurs de bases de dx et dy. 
      #Ces valeurs donneront une trajectoire oblique.
      
      • Partager sur Facebook
      • Partager sur Twitter
        1 juillet 2010 à 23:28:11

        Merci, le programme fonctionne bel est bien.
        Mais je n'ai pas encore tout compris...
        Ca viendra surement avec le temps...
        • Partager sur Facebook
        • Partager sur Twitter

        coordonnée, canevas

        × 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