Dessiner avec la souris
Dans le cours sur les boutons, le programme attendait un clic. Ici, on va suivre la souris en continu, sans attendre : de quoi créer un programme de dessin, comme un petit Paint.
Lire la position de la souris
Quatre fonctions lisent l'état de la souris sans bloquer le programme :
souris_x(toile) et souris_y(toile) : sa position sur la toile, ou -1 si elle est en dehors ;souris_appuyée(toile) : vrai tant que le bouton gauche est enfoncé ;souris_clic(toile) : vrai une seule fois après un clic.
Comme elles n'attendent pas, on les appelle dans une boucle qui tourne en permanence, avec une petite pause.
Un viseur qui suit la souris
t est une toile
dimension(t, 400, 260)
tant que non touche_pressée('échap')
effacer(t)
remplir(t, #0D1117)
label(t, 10, 20, 'Bouge la souris. Échap pour quitter.', #8B98A5, 12)
si souris_x(t) >= 0 alors
cercle(t, souris_x(t), souris_y(t), 12, #FFD43B)
fin si
affiche t
pause 30
fin tant que
affiche 'Terminé.'
À chaque tour, on efface tout et on redessine le cercle à la nouvelle position : il semble suivre la souris. Le test souris_x(t) >= 0 évite de dessiner quand la souris est sortie de la toile.
Question : Que renvoie souris_x(t) quand la souris n'est pas sur la toile ? — -1. En dehors de la toile, souris_x et souris_y renvoient -1.
Laisser une trace
Pour dessiner, il suffit de ne plus effacer : chaque cercle reste sur la toile. Et on ne dessine que lorsque le bouton est enfoncé.
t est une toile
dimension(t, 400, 260)
remplir(t, #FFFFFF)
affiche t
tant que non touche_pressée('échap')
si souris_appuyée(t) et souris_x(t) >= 0 alors
cercle(t, souris_x(t), souris_y(t), 5, #1D9BF0)
fin si
affiche t
pause 30
fin tant que
Maintiens le bouton de la souris et déplace-la : tu dessines ! La toile garde toutes les formes déjà tracées, puisqu'on n'appelle plus effacer.
Un vrai programme de dessin
Ajoutons des commandes au clavier : changer de couleur, changer la taille du pinceau, tout effacer.
t est une toile
dimension(t, 420, 280)
remplir(t, #FFFFFF)
teinte est un nombre vaut 210
epaisseur est un nombre vaut 5
tant que non touche_pressée('échap')
// C : couleur suivante
si touche_pressée('c') alors
teinte vaut (teinte + 45) mod 360
fin si
// G : pinceau plus gros, P : plus petit
si touche_pressée('g') alors
epaisseur vaut limiter(epaisseur + 2, 1, 25)
fin si
si touche_pressée('p') alors
epaisseur vaut limiter(epaisseur - 2, 1, 25)
fin si
// E : tout effacer
si touche_pressée('e') alors
effacer(t)
remplir(t, #FFFFFF)
fin si
// dessiner tant que le bouton est enfoncé
si souris_appuyée(t) et souris_x(t) >= 0 alors
cercle(t, souris_x(t), souris_y(t), epaisseur, tls(teinte, 85, 50))
fin si
affiche t
pause 30
fin tant que
affiche 'Dessin terminé.'
Les commandes : C change la couleur, G et P grossissent ou réduisent le pinceau, E efface tout, Échap quitte.
touche_pressée est vrai une seule fois par appui : un appui sur C change la couleur d'un cran, même si on garde la touche enfoncée ;(teinte + 45) mod 360 fait tourner la teinte sur le cercle des couleurs et revient à 0 après 360 ;limiter garde l'épaisseur entre 1 et 25.
Si tu bouges vite, les cercles s'espacent. Pour un trait continu, garde en mémoire la position précédente et trace une ligne entre l'ancienne et la nouvelle position.
En résumé
souris_x, souris_y, souris_appuyée et souris_clic lisent la souris sans bloquer.- Elles s'utilisent dans une boucle avec une
pause de 30 à 60 millisecondes. - Effacer à chaque tour : l'objet suit la souris. Ne pas effacer : il laisse une trace.
touche_pressée déclenche une action une fois par appui.