Animation

Animations

ANIMATION  :

Avec le module tkinter, on dispose d’une méthode after() applicable à la fenêtre qui va nous permettre de déclencher une fonction après un délai précisé et qui a l’avantage de ne pas bloquer les autres processus.

def fonction():
    {contenu de la fonction}
    .........................
    fenetre.after(delai,fonction)

(ligne 19 : délai = 5 millièmes de secondes, fonction= avancer)

Remarque :

On indique seulement le nom de la fonction à appeler sans paramètre ni parenthèses, si l’on veut passer des paramètres il faut utiliser la fonction lambda.

LE SOLEIL A RENDEZ VOUS ...  :

Exemple d’animation :

le soleil et la lune se rencontrent, des petites étoiles tombent.

html video code by EasyHtml5Video.com v3.9.1

Le code:

_images/image209.png

LANCER DE BALLES :

Exemple d’animation : lancer de balles

def fonction(paramètres):
   {contenu de la fonction}
   fenetre.after(délai, lambda : fonction(paramètres))

ligne 23 la fonction lambda est utilisée pour passer des paramètres pour la fonction déplacement :

délai = 20 millièmes de seconde

fonction = déplacement

paramètres= balle,x,y,dx,dy,rayon,largeur,hauteur

html video code by EasyHtml5Video.com v3.9.1

Le code :

#0906 animation balle.py
from tkinter import *
import  math,random 
def creer_fenetre(fenetre,taille,titre,icone,couleur):
 """redimensionne, le titre, l'icône, la couleur"""
 fenetre.geometry(taille) # redimensionne la fenêtre
 fenetre.title(titre)  # affiche le titre dans la fenêtre
 fenetre.iconbitmap(icone) # change l'icône de la fenêtre
 fenetre.configure(bg=couleur)# change la couleur du fond
 return fenetre
def deplacement(balle,x,y,dx,dy,rayon,largeur,hauteur):
 """gère le déplacement et le rebond d'une balle"""
 if x+rayon+dx > largeur:# rebond à droite
  x,dx = 2*(largeur-rayon)-x,-dx
 if x-rayon+dx < 0:# rebond à gauche
  x,dx = 2*rayon-x,-dx
 if y+rayon+dy > hauteur:# rebond en bas
  y,dy  = 2*(hauteur-rayon)-y,-dy 
 if y-rayon+dy < 0:# rebond en haut
  y, dy= 2*rayon-y,-dy
 x ,y= x+dx,y+dy
 can.coords(balle,x-rayon,y-rayon,x+rayon,y+rayon)
 fenetre.after(20,lambda:deplacement(balle,x,y,dx,dy,rayon,largeur,hauteur))
def angle_depart(vitesse,largeur,hauteur):
 """création des valeurs de départ"""
 angle = random.uniform(0,2*math.pi)
 dx = vitesse*math.cos(angle)
 dy = vitesse*math.sin(angle)
 x=random.randint(20,450)
 y=random.randint(20,350)
 return x,y,dx,dy
def lancer_balle(vitesse,largeur,hauteur,rayon,couleur):
 """Lance une balle"""
 x,y,dx,dy=angle_depart(vitesse,largeur,hauteur)
 balle=can.create_oval(x,y,x+rayon,y+rayon,fill=couleur)
 deplacement(balle,x,y,dx,dy,rayon,largeur,hauteur)

# -------------programme principal --------------------------------
couleur='light blue'
titre="Animation Balle"
icone="logo-isn.ico"
largeur,hauteur=500,300
rayon,vitesse=20,10
taille=str(largeur)+'x'+str(hauteur+80)
cr,rayonr,cb,rayonb='red',30,'blue',20
ft='verdana 12 bold'
tr,cr,tb,cb,cbe='Balle rouge','red','Balle bleue','blue','light blue'
fenetre = Tk()
creer_fenetre(fenetre,taille,titre,icone,couleur)
can=Canvas(fenetre,width=largeur,height=hauteur,bg='gold')
can.grid(row=0,column=0,columnspan=2)
B=Button(fenetre,text=tr,font=ft,bg=cr,command=lambda:lancer_balle(vitesse,largeur,hauteur,rayonr,cr))
B.grid(row=1,column=0)
B1=Button(fenetre,text=tb,font=ft,bg=cbe,command=lambda:lancer_balle(vitesse,largeur,hauteur,rayonb,cb))
B1.grid(row=1,column=1)
fenetre.mainloop()


COLLISIONS  :

Exemple : gestion de collision.

La gestion de la collision entre deux objets dans un canevas est très utilisée pour beaucoup de jeux :

html video code by EasyHtml5Video.com v3.9.1

Le code:

#0907 collision objet.py
from tkinter import *
import  math,random 
def creer_fenetre(fenetre,taille,titre,icone,couleur):
 """redimensionne, le titre, l'icône, la couleur"""
 fenetre.geometry(taille) # redimensionne la fenêtre
 fenetre.title(titre)  # affiche le titre dans la fenêtre
 fenetre.iconbitmap(icone) # change l'icône de la fenêtre
 fenetre.configure(bg=couleur)# change la couleur du fond
 return fenetre
def deplacement(balle,x,y,dx,dy,rayon,largeur,hauteur):
 """gère le déplacement et le rebond d'une balle"""
 if x+rayon+dx > largeur:# rebond à droite
  x,dx = 2*(largeur-rayon)-x,-dx
 if x-rayon+dx < 0:# rebond à gauche
  x,dx = 2*rayon-x,-dx
 if y+rayon+dy > hauteur:# rebond en bas
  y,dy  = 2*(hauteur-rayon)-y,-dy 
 if y-rayon+dy < 0:# rebond en haut
  y, dy= 2*rayon-y,-dy
 x ,y= x+dx,y+dy
 collision=collision_objet()
 if collision==True:
  can.coords(balle,x-rayon,y-rayon,x+rayon,y+rayon)
  fenetre.after(20,lambda:deplacement(balle,x,y,dx,dy,rayon,largeur,hauteur))
 else:
  fv='verdana 26 bold'
  can.create_text(200,200,text='COLLISION',font=fv,fill='red')
def angle_depart(vitesse,largeur,hauteur):
 """création des valeurs de départ"""
 angle = random.uniform(0,2*math.pi)
 dx = vitesse*math.cos(angle)
 dy = vitesse*math.sin(angle)
 x=random.randint(20,largeur-50)
 y=random.randint(20,hauteur-50)
 return x,y,dx,dy
def lancer_balle(vitesse,largeur,hauteur,rayon,couleur):
 """Lance une balle"""
 x,y,dx,dy=angle_depart(vitesse,largeur,hauteur)
 balle=can.create_oval(x,y,x+rayon,y+rayon,fill=couleur)
 deplacement(balle,x,y,dx,dy,rayon,largeur,hauteur)
def collision_objet():
 """detetecte une collision"""
 collision=True
 liste=can.find_all()
 dim=len(liste)
 coord=4*[]
 listetemp_x=(dim+1)*[0]
 listetemp_y=(dim+1)*[0]
 i=0
 for w in liste:
  coord=can.coords(w)
  listetemp_x[i]=coord[0]
  listetemp_y[i]=coord[1]
  i=i+1
 for i in range(dim):
  for j in range(i+1,dim):
    x1,x2=listetemp_x[i],listetemp_x[j]
    y1,y2=listetemp_y[i],listetemp_y[j]
    if dim>1:
     if (x1<x2+30 and x1>x2-30) and (y1<y2+30 and y1>y2-30):
      collision=False
 return collision
def nettoie_fenetre(fenetre,can):
 """efface tous les items du canevas"""
 can.delete(ALL)
 can=can.configure(width=largeur,height=hauteur,bg='yellow green')
def quitter(fenetre):
 """ détruit la fenêtre"""
 fenetre.destroy()
# -------------programme principal --------------------------------
couleur='light blue'
titre="Collision"
icone="logo-isn.ico"
largeur,hauteur=500,300
rayon,vitesse=20,10
taille=str(largeur)+'x'+str(hauteur+80)
cr,rayonr,cb,rayonb='red',30,'blue',20
ft='verdana 12 bold'
tr,cr,tb,cb,cbe='Balle rouge','red','Balle bleue','blue','light blue'
fenetre = Tk()
creer_fenetre(fenetre,taille,titre,icone,couleur)
can=Canvas(fenetre,width=largeur,height=hauteur,bg='yellow green')
can.grid(row=0,column=0,columnspan=4)
B=Button(fenetre,text=tr,font=ft,bg=cr,command=lambda:lancer_balle(vitesse,largeur,hauteur,rayonr,cr))
B.grid(row=1,column=0)
B1=Button(fenetre,text=tb,font=ft,bg=cbe,command=lambda:lancer_balle(vitesse,largeur,hauteur,rayonb,cb))
B1.grid(row=1,column=1)
B2=Button(fenetre,text='Quitter',font=ft,bg='red',command=lambda :quitter(fenetre)) 
B2.grid(row=1,column=3)
B3=Button(fenetre,text='Nettoyer',font=ft,bg='orange',command=lambda:nettoie_fenetre(fenetre,can)) 
B3.grid(row=1,column=2)
fenetre.mainloop()



© Copyright education-du-numerique.fr Tous droits réservés.                            D Pérarnaud  LIMOGES