Files
vitrine-pixels/8x32 PI/mes_animations.py
T
2026-10-08 15:25:14 +02:00

177 lines
5.9 KiB
Python

"""
=============================================================================
MES ANIMATIONS — dessiner avec du code (en Python)
Workshop « Vitrine pixels »
=============================================================================
Krita, c'est pour DESSINER les animations image par image.
Ce fichier, c'est pour les CALCULER : hasard, mouvements continus,
arc-en-ciel… des choses très longues à dessiner à la main.
Ce sont les mêmes animations que dans matrice_8x32.ino (Arduino),
traduites en Python : comparez les deux fichiers, ligne à ligne !
Lancer :
python3 mes_animations.py --simulateur (sur l'ordinateur)
sudo ~/vitrine-env/bin/python mes_animations.py (sur le Pi)
Transformer la playlist en GIF, pour que le lecteur la joue avec les
dessins de l'équipe Krita (la playlist est alors jouée une seule fois) :
python3 mes_animations.py --enregistrer animations/10_code.gif
PYTHON EN 6 RÈGLES (pour qui connaît l'Arduino)
-----------------------------------------------
1. Pas de point-virgule en fin de ligne, pas d'accolades { }.
2. Ce sont les ESPACES en début de ligne (l'indentation) qui disent ce
qui est « dans » une boucle ou une fonction. 4 espaces par niveau.
3. Pas de type à déclarer : x = 3 au lieu de int x = 3;
4. Une fonction : def nom(): au lieu de void nom() {
5. Une boucle : for x in range(32): (x va de 0 à 31)
au lieu de for (int x = 0; x < 32; x++) {
6. Un commentaire commence par # au lieu de //
LES OUTILS DE DESSIN (définis dans matrice.py)
----------------------------------------------
pixel(x, y, couleur) colore un pixel (x de 0 à 31, y de 0 à 7)
lire_pixel(x, y) renvoie la couleur d'un pixel
effacer() éteint tout (dans la toile)
effacer(couleur) remplit tout d'une couleur
assombrir(25) assombrit tout de 25 % (traînées)
montrer() AFFICHE la toile (sinon rien n'apparaît !)
attendre(100) attend 100 millisecondes
Couleurs : ROUGE, ORANGE, JAUNE, VERT, CYAN, BLEU, VIOLET, MAGENTA, ROSE,
BLANC, NOIR, ou (rouge, vert, bleu) de 0 à 255,
ou teinte(t) avec t de 0 à 255 pour faire le tour de l'arc-en-ciel.
"""
import random # pour le hasard
import sys # pour lire les options de la ligne de commande
# « from matrice import * » = importer TOUS les outils du moteur, pour
# écrire pixel(...) au lieu de matrice.pixel(...).
from matrice import *
# =============================================================================
# LES ANIMATIONS
# =============================================================================
# À VOUS DE JOUER : copiez une animation, renommez-la, modifiez-la,
# et ajoutez son nom dans la PLAYLIST tout en bas.
# --- Animation 1 : arc-en-ciel qui défile ---
def anim_arc_en_ciel():
for temps in range(256):
for x in range(LARGEUR):
for y in range(HAUTEUR):
# La teinte dépend de la colonne et du temps qui passe.
pixel(x, y, teinte(x * 8 + temps * 2))
montrer()
attendre(20)
# --- Animation 2 : la pluie ---
def anim_pluie():
for image in range(200):
assombrir(25) # les gouttes laissent une traînée qui s'estompe
# Faire descendre toute l'image d'une ligne, en partant du bas
# (range(7, 0, -1) compte à rebours : 7, 6, 5… 1).
for y in range(HAUTEUR - 1, 0, -1):
for x in range(LARGEUR):
pixel(x, y, lire_pixel(x, y - 1))
# La ligne du haut s'éteint, puis 3 nouvelles gouttes au hasard.
for x in range(LARGEUR):
pixel(x, 0, NOIR)
for n in range(3):
pixel(random.randrange(LARGEUR), 0, (0, 120, 255))
montrer()
attendre(60)
# --- Animation 3 : un dessin en pixel art qui défile ---
# Une lettre par pixel, « . » = éteint. 8 lignes de même longueur.
DESSIN = [
"..RR.RR..",
".RBRRRRR.",
".RRRRRRR.",
".RRRRRRR.",
"..RRRRR..",
"...RRR...",
"....R....",
".........",
]
# Un « dictionnaire » associe chaque lettre à une couleur.
COULEUR_DE_LETTRE = {
"R": ROUGE, "O": ORANGE, "J": JAUNE, "V": VERT, "C": CYAN,
"B": BLANC, "L": BLEU, "M": MAGENTA, "P": ROSE,
}
def dessiner_dessin(depart_x):
for y, ligne in enumerate(DESSIN): # enumerate donne le numéro ET la ligne
for x, lettre in enumerate(ligne):
if lettre in COULEUR_DE_LETTRE:
pixel(depart_x + x, y, COULEUR_DE_LETTRE[lettre])
def anim_dessin_qui_defile():
largeur_dessin = len(DESSIN[0]) # len = longueur de la ligne
for x in range(LARGEUR, -largeur_dessin - 1, -1):
effacer()
dessiner_dessin(x)
montrer()
attendre(70)
# --- Animation 4 : étincelles ---
def anim_etincelles():
for image in range(300):
assombrir(8)
pixel(random.randrange(LARGEUR), random.randrange(HAUTEUR),
teinte(random.randrange(256), saturation=200))
montrer()
attendre(15)
# --- Exemple : votre première animation ---
def anim_ma_premiere():
for x in range(LARGEUR):
effacer()
pixel(x, 3, JAUNE)
pixel(x, 4, JAUNE)
montrer()
attendre(50)
# =============================================================================
# LA PLAYLIST
# =============================================================================
# Mettez # devant une ligne pour sauter une animation.
def playlist():
anim_arc_en_ciel()
anim_pluie()
anim_dessin_qui_defile()
anim_etincelles()
# anim_ma_premiere()
if __name__ == "__main__":
demarrer()
try:
while True: # en boucle, comme loop() sur l'Arduino
playlist()
if "--enregistrer" in sys.argv:
break # en enregistrement, un seul tour suffit
except KeyboardInterrupt:
print("\nArrêt demandé.")
finally:
eteindre()