177 lines
5.9 KiB
Python
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()
|