""" ============================================================================= 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()