Réutiliser un dessin
Tu sais dessiner une maison. Mais pour en dessiner dix, il faudrait recopier dix fois les mêmes lignes en changeant les coordonnées ? Non : on range le dessin dans une procédure, et on l'appelle autant de fois qu'on veut.
Un dessin dans une procédure
Voici un arbre : un tronc et un feuillage. Les paramètres posX (le bord gauche) et sol (la hauteur du sol) indiquent où le planter.
t est une toile
dimension(t, 400, 220)
remplir(t, #BDE3FF)
rectangle(t, 0, 180, 400, 40, #6CC24A)
procédure arbre(posX, sol)
rectangle(t, posX + 14, sol - 40, 12, 40, #8E5A2B)
cercle(t, posX + 20, sol - 55, 26, #2E8B3D)
fin procédure
appelle arbre(40, 180)
appelle arbre(160, 180)
appelle arbre(290, 180)
affiche t
Toutes les coordonnées sont calculées à partir des paramètres : posX + 14, sol - 40... En changeant les valeurs à l'appel, tout l'arbre se déplace d'un bloc.
La procédure dessine sur la toile t, déclarée dans le programme principal : une procédure peut utiliser les variables du programme.
Ajouter un paramètre de taille
Avec un paramètre zoom, on multiplie toutes les dimensions : le même dessin, en petit ou en grand.
t est une toile
dimension(t, 400, 220)
remplir(t, #BDE3FF)
rectangle(t, 0, 180, 400, 40, #6CC24A)
procédure arbre(posX, sol, zoom)
rectangle(t, posX + 14 * zoom, sol - 40 * zoom, 12 * zoom, 40 * zoom, #8E5A2B)
cercle(t, posX + 20 * zoom, sol - 55 * zoom, 26 * zoom, #2E8B3D)
fin procédure
appelle arbre(30, 180, 1)
appelle arbre(130, 180, 1.6)
appelle arbre(280, 180, 0.7)
affiche t
Question : Dans appelle arbre(130, 180, 1.6), quelle est la largeur du tronc ? — 19,2 pixels. La largeur est 12 * zoom, soit 12 × 1,6 = 19,2 pixels.
Une forêt en trois lignes
Une procédure et une boucle : la combinaison gagnante. Le hasard évite que tous les arbres se ressemblent.
t est une toile
dimension(t, 420, 240)
remplir(t, #BDE3FF)
rectangle(t, 0, 190, 420, 50, #6CC24A)
procédure arbre(posX, sol, zoom)
rectangle(t, posX + 14 * zoom, sol - 40 * zoom, 12 * zoom, 40 * zoom, #8E5A2B)
cercle(t, posX + 20 * zoom, sol - 55 * zoom, 26 * zoom, #2E8B3D)
fin procédure
pour i de 0 à 7
appelle arbre(i * 50, 190 + hasard(0, 30), hasard(6, 12) / 10)
fin pour
affiche t
hasard(6, 12) / 10 donne une échelle entre 0,6 et 1,2.
Un paramètre de couleur
Un paramètre peut aussi porter une couleur, fabriquée avec rgb ou tls :
t est une toile
dimension(t, 420, 200)
remplir(t, #BDE3FF)
rectangle(t, 0, 160, 420, 40, #6CC24A)
procédure maison(posX, sol, teinteMurs)
toit est un nombre vaut sol - 60
rectangle(t, posX, toit, 80, 60, teinteMurs)
triangle(t, posX - 8, toit, posX + 88, toit, posX + 40, toit - 40, #C0392B)
rectangle(t, posX + 32, sol - 34, 18, 34, #8E5A2B)
rectangle(t, posX + 10, sol - 46, 16, 16, #FFFFFF)
fin procédure
pour i de 0 à 3
appelle maison(20 + i * 100, 160, tls(i * 50 + 20, 60, 80))
fin pour
affiche t
Quatre maisons, quatre couleurs de murs, une seule procédure.
Composer une scène
Une fois les briques écrites, la scène complète se lit comme une liste :
t est une toile
dimension(t, 420, 240)
procédure arbre(posX, sol, zoom)
rectangle(t, posX + 14 * zoom, sol - 40 * zoom, 12 * zoom, 40 * zoom, #8E5A2B)
cercle(t, posX + 20 * zoom, sol - 55 * zoom, 26 * zoom, #2E8B3D)
fin procédure
procédure maison(posX, sol, teinteMurs)
toit est un nombre vaut sol - 60
rectangle(t, posX, toit, 80, 60, teinteMurs)
triangle(t, posX - 8, toit, posX + 88, toit, posX + 40, toit - 40, #C0392B)
rectangle(t, posX + 32, sol - 34, 18, 34, #8E5A2B)
fin procédure
procédure decor()
remplir(t, #BDE3FF)
rectangle(t, 0, 190, 420, 50, #6CC24A)
cercle(t, 360, 50, 28, #FFD43B)
fin procédure
appelle decor()
appelle arbre(20, 190, 1.2)
appelle maison(120, 190, tls(40, 70, 85))
appelle arbre(230, 190, 0.8)
appelle maison(300, 190, tls(200, 50, 85))
affiche t
L'ordre des appels compte : ce qui est dessiné en dernier passe devant.
En résumé
- Un dessin rangé dans une procédure se réutilise autant de fois qu'on veut.
- Les coordonnées se calculent à partir des paramètres : position, échelle, couleur.
- Une boucle et du hasard transforment un arbre en forêt.
- Une scène complexe devient une suite d'appels faciles à lire.