Animer plusieurs objets
Animer une balle demande quatre variables : sa position (x, y) et sa vitesse (x, y). Pour douze balles, il faudrait quarante-huit variables ? Non : quatre tableaux, et une boucle.
Un tableau par caractéristique
La balle numéro i a sa position dans posX[i] et posY[i], sa vitesse dans vitX[i] et vitY[i]. Les tableaux avancent ensemble : ce sont des tableaux parallèles.
t est une toile
dimension(t, 400, 300)
NB est une constante vaut 12
posX est un tableau
posY est un tableau
vitX est un tableau
vitY est un tableau
teintes est un tableau
pour i de 0 à NB - 1
posX ajoute hasard(20, 380)
posY ajoute hasard(20, 280)
vitX ajoute (hasard(0, 1) * 2 - 1) * hasard(2, 5)
vitY ajoute (hasard(0, 1) * 2 - 1) * hasard(2, 5)
teintes ajoute tls(i * 30, 85, 60)
fin pour
tant que non touche_pressée('échap')
effacer(t)
remplir(t, #0D1117)
pour i de 0 à NB - 1
posX[i] ajoute vitX[i]
posY[i] ajoute vitY[i]
si posX[i] < 10 ou posX[i] > 390 alors
vitX[i] vaut -vitX[i]
fin si
si posY[i] < 10 ou posY[i] > 290 alors
vitY[i] vaut -vitY[i]
fin si
cercle(t, posX[i], posY[i], 10, teintes[i])
fin pour
affiche t
pause 30
fin tant que
La première boucle crée les balles. Dans la boucle d'animation, la boucle pour fait pour chaque balle exactement ce qu'on faisait pour une seule : avancer, rebondir, dessiner.
L'astuce hasard(0, 1) * 2 - 1 donne -1 ou 1 : une fois sur deux, la balle part dans l'autre sens.
Question : Pour passer de 12 à 50 balles, que faut-il modifier ? — Seulement la constante NB. Tout le programme dépend de NB : changer cette seule valeur suffit. C'est tout l'intérêt des tableaux et des constantes.
Il neige !
Chaque flocon a une position et une taille. Les gros flocons tombent plus vite. Quand un flocon atteint le bas, il repart en haut, à une nouvelle position : on recycle les mêmes flocons à l'infini.
t est une toile
dimension(t, 400, 300)
NB est une constante vaut 80
floconX est un tableau
floconY est un tableau
rayons est un tableau
pour i de 0 à NB - 1
floconX ajoute hasard(0, 400)
floconY ajoute hasard(0, 300)
rayons ajoute hasard(1, 4)
fin pour
tant que non touche_pressée('échap')
effacer(t)
remplir(t, #0B1026)
pour i de 0 à NB - 1
floconY[i] ajoute rayons[i]
si floconY[i] > 300 alors
floconY[i] vaut 0
floconX[i] vaut hasard(0, 400)
fin si
cercle(t, floconX[i], floconY[i], rayons[i], #FFFFFF)
fin pour
rectangle(t, 0, 285, 400, 15, #E5E7EB)
affiche t
pause 40
fin tant que
floconY[i] ajoute rayons[i] : un flocon de rayon 4 descend de 4 pixels par image, un flocon de rayon 1 d'un seul pixel. Cette différence de vitesse donne une impression de profondeur.
Ajouter et retirer des objets
Jusqu'ici, le nombre d'objets était fixe. Ici, chaque clic crée une bulle, qui monte puis disparaît en haut de la toile. Les tableaux grandissent et rétrécissent pendant que le programme tourne.
t est une toile
dimension(t, 400, 300)
bulleX est un tableau
bulleY est un tableau
affiche t
tant que non touche_pressée('échap')
si souris_clic(t) alors
bulleX ajoute souris_x(t)
bulleY ajoute souris_y(t)
fin si
effacer(t)
remplir(t, #06283D)
label(t, 10, 20, 'Clique pour créer des bulles', #8FB8CC, 12)
pour i de longueur(bulleX) - 1 à 0 pas -1
bulleY[i] soustrait 3
si bulleY[i] < -15 alors
bulleX supprime i
bulleY supprime i
sinon
cercle(t, bulleX[i], bulleY[i], 12, #7DD3FC)
fin si
fin pour
label(t, 10, 290, 'Bulles : ' + longueur(bulleX), #8FB8CC, 12)
affiche t
pause 30
fin tant que
souris_clic(t) est vrai une fois par clic : on ajoute une position dans chaque tableau.- Une bulle sortie par le haut est retirée des deux tableaux avec
supprime.
Quand on supprime des cases pendant un parcours, on parcourt le tableau à l'envers, de la fin vers le début. Dans l'autre sens, les cases suivantes se décalent d'un cran et la boucle en sauterait une, ou irait lire une case qui n'existe plus.
Organiser un programme d'animation
Presque toutes les animations suivent le même plan :
- Créer les objets : remplir les tableaux.
- Dans la boucle, mettre à jour chaque objet : déplacer, tester les bords.
- Dessiner chaque objet.
- Afficher, puis attendre un court instant avec
pause.
En résumé
- Un tableau par caractéristique : positions, vitesses, tailles, couleurs.
- Une boucle
pour applique le même traitement à chaque objet. - Une constante règle le nombre d'objets.
- Pour supprimer pendant un parcours, on parcourt à l'envers.