Apprentissage de la programmation en P_LOGO
Les lutins et autres farfadets.

 

 

Retour au sommaire

Il y a quelques années (au début des années 1980), les programmeurs appelaient ça des " sprites ", ils étaient difficiles à réaliser et aussi très prisés par les inventeurs de jeux d’arcade.

Peu connus et par conséquent peu exploités dans les animations en robotique à Sciences Techniques Jeunesse, les lutins du LOGO sont des éléments amusants et intéressants pour réaliser des animations simples.

Les lutins sont des tortues dont on a choisi la forme et qui peuvent bouger, changer de forme, de couleur…

Comme dans la partie " LOGO et MEC : Y a-t-il plus simple è ", nous allons essayer de définir des formes et de jouer avec.

Pour créer une forme, il faut d’abord la dessiner. Par exemple, on veut représenter une roue à aube. La voilà :

POUR ROUEAUBE1

CERCLE 20

CERCLE 15

CERCLE 5

REPETE 9 [AV 20 RE 20 TD 40]

FIN

VE ROUEAUBE1 CT

On veut que la tortue prenne la forme de la roue à aube. Rien de plus simple : CREEFORME "ROUE0. On remarque que l'écran se remplit pour chercher les limites du dessin, afin de déterminer la nouvelle forme.

On peut maintenant utiliser la nouvelle forme :

VE FFORME "ROUE0

AV 100 TG 90 AV 120

C'est rigolo non è

Pour connaître la liste des formes connues, il suffit de consulter le contenu de la liste LISTEFORMES, par exemple avec un TE EC LISTEFORMES. (Le TE ou TEXTEECRAN n'est là que pour permettre de visualiser une éventuelle longue liste.)

Si l'on n'est pas content de notre roue, que l'on voulait non pas à 9, mais à 5 pales, il faut modifier la procédure ROUEAUBE2.

POUR ROUEAUBE2

CERCLE 20

CERCLE 15

CERCLE 5

REPETE 5 [AV 20 RE 20 TD 72]

FIN

VE ROUEAUBE2 CT

CREEFORME "ROUE0

Et là, oh surprise, LOGO n'est pas d'accord, il trouve que ROUE0 existe déjà. Une forme créée est connue tant qu'on ne sort pas de P_LOGO. Il va falloir, soit donner un autre nom, soit effacer la forme précédente : DETRUISFORME "ROUE0. On peut relancer CREEFORME "ROUE0.

Pour accélérer les choses, nous pouvons introduire la création de la forme dans notre procédure ROUEAUBE2, qui devient.

POUR ROUEAUBE3

VE CT

CERCLE 20 CERCLE 15 CERCLE 5

REPETE 5 [AV 20 RE 20 TD 72]

SI MEMBREè "ROUE0 LISTEFORMES [DETRUISFORME "ROUE0]

CREEFORME "ROUE0

FIN

ROUEAUBE3

Le tour est joué. Un nouveau VE FFORME "ROUE0 et notre roue à aube réapparaît à l'écran à la place de la tortue. Pour bien faire, nous allons dessiner un moulin en mettre la roue devant à la bonne place :

POUR FENETRE

REPETE 4 [AV 10 TD 90]

AV 5 TD 90 AV 10

TD 90 AV 5 TD 90 AV 5 TD 90 AV 10

TG 90 AV 5 TD 90 RE 10

FIN

POUR MOULIN

BC

REPETE 2 [AV 70 TD 90 AV 50 TD 90]

AV 70

TD 45

FCC 12

REPETE 2 [AV RC PROD 2 PROD 25 25 TD 90]

LC TD 45 AV 50 TD 90 RE 70

FCC 14

LC TD 90 AV 10 TG 90 AV 50 BC FENETRE

LC TD 90 AV 20 TG 90 BC FENETRE

FIN

VE CT MOULIN

LC ORIGINE TD 90 AV 25 TG 90 AV 10

FCC 6 FFORME "ROUE0 MT

C'est bien beau tout ça, mais ça ne fait pas encore d'animation, à moins de déplacer la tortue sur l'écran.

On va faire beaucoup mieux, faire tourner la roue à aube à l'écran, sans effacer le moulin. Pour cela, il va falloir créer plusieurs formes de roues en modifiant un peu notre procédure ROUEAUBE3. Pour faire tourner la roue, il suffit de changer l'angle de la tortue au départ. Les nouvelles formes vont être nommées ROUE0, ROUE1, ROUE2… On va en faire 9 différentes (9, c'est parce que c'est un multiple de 72). La procédure ROUEAUBE4 va créer toutes les formes de roues automatiquement.

POUR ROUEAUBE4 :NUMROUE

SI PLGè :NUMROUE 8 [STOP]

VE CT TD PROD :NUMROUE 8

CERCLE 20 CERCLE 15 CERCLE 5

REPETE 5 [AV 20 RE 20 TD 72]

SOIT "NOMFORME MOT "ROUE :NUMROUE

SI MEMBREè :NOMFORME LISTEFORMES [DETRUISFORME :NOMFORME]

CREEFORME :NOMFORME

ROUEAUBE4 SOMME :NUMROUE 1

FIN

Une petite explication est sans doute nécessaire.

Le paramètre :NUMROUE contient le numéro de la roue. On commencera par 0. La dernière ligne de la procédure (avant le FIN) relance la même procédure (c'est de la récursivité terminale) en ajoutant 1 à la valeur du numéro de la roue. La deuxième ligne compare le numéro de la roue avec 8, si celle-là est plus grande (on a déjà fait les 9 roues), on arrête la procédure, le travail est terminé.

Ente les deux, on ne change pas grand chose par rapport à ROUEAUBE3, sinon qu'on détermine l'angle de départ en multipliant 8 par le numéro de la roue. La roue numéro 0 est droite, le roue numéro 1 est incliné à droite de 8 degrés, le numéro 2 de 16 degrés et ainsi de suite. Si on avait continué jusqu'au numéro 9, on se serait aperçu que la roue est exactement la même que celle portant le numéro 0.

Ensuite, on dessine la roue, les rayons sont plus ou moins inclinés.

La ligne SOIT "NOMFORME permet de stocker dans une variable locale à la procédure (variable inconnue des autres procédures et qui sera effacée sitôt la procédure achevée), le mot constitué de ROUE suivit du numéro de la roue. Au premier passage, :NOMFORME contient "ROUE0, au deuxième, elle contiendra "ROUE1, etc.

La suite est identique à ROUEAUBE3. On peut exécuter la commande suivante : ROUEAUBE4 0 et constater que les roues se construisent les unes après les autres.

Une consultation de LISTEFORMES permet de vérifier que les formes sont bien mémorisées.

Et maintenant, action ! Il va falloir animer tout ça. Rien de plus simple, il suffit de remplacer une forme par une autre. Quand la tortue a la forme "ROUE0, après un certain temps, il faut lui donner la forme "ROUE1 et ainsi de suite. Quand on est arrivé à la forme "ROUE8, on revient à la forme "ROUE0.

POUR ANIMEROUE :NUMROUE

ATTENDS 0.2

FFORME MOT "ROUE :NUMROUE

ANIMEROUE SI EGALè :NUMROUE 8 [0] [SOMME :NUMROUE 1]

FIN

La procédure ANIMEROUE fonctionne sur un modèle similaire à ROUEAUBE4. Pour commencer, on attend 2 dixièmes de seconde. Ensuite, on donne la forme correspondant au numéro de la roue à la tortue. Enfin, on relance la même procédure avec comme paramètre, soit 0 (si le numéro de la roue actuelle est 8), soit le numéro de roue suivant. Attention, la procédure ne s'arrête jamais, à moins de reprendre la main avec CTRL+C.

On peut lancer la suite des ordres que voici…

ROUEAUBE4 0

VE CT MOULIN

LC ORIGINE TD 90 AV 25 TG 90 AV 10

FCC 6 FFORME "ROUE0 MT

ANIMEROUE 0

… pour voir le superbe moulin avec sa roue animé. Même sur un ordinateur peu performant (par exemple un 286), l'animation sera fluide.

Pour le fun, ajoutons de l'eau qui s'écoule :

POUR VAGUE

TG 45 AV 5 TD 90 AV 10 TG 90 AV 5 TD 45

FIN

POUR EAU

VE CT

REPETE 16 [BC VAGUE LC TD 180 VAGUE TG 90 AV 5 TG 90]

SI MEMBREè "EAU LISTEFORMES [DETRUISFORME "EAU]

CREEFORME "EAU

FIN

Rien de nouveau, on définit une nouvelle forme.

La procédure d'animation devient :

POUR ANIMETOUT :NUMROUE :NUMEAU

ATTENDS 0.2

FTORTUE 0 FFORME MOT "ROUE :NUMROUE

FTORTUE 1 FPOS LISTE DIFF 25 :NUMEAU -10

ANIMETOUT SI EGALè :NUMROUE 8 [0] [SOMME :NUMROUE 1] SI EGALè :NUMEAU 4 [0] [SOMME :NUMEAU 1]

FIN

Et pour mettre en marche le tout :

POUR DEPART

EAU

ROUEAUBE4 0

VE CT MOULIN

LC ORIGINE TD 90 AV 25 TG 90 AV 10

FCC 6 FFORME "ROUE0 MT

FTORTUE 1 FCC 1 LC MT FFORME "EAU

FTORTUE 2 LC MT FPOS [-20 -10]

FTORTUE 3 LC MT FPOS [65 -10]

ANIMETOUT 0 0

FIN

DEPART

Les tortues 2 et 3 ne sont là que pour cacher les extrémités de l'eau, cela donne une impression de courant sans fin.

Deux primitives sont bien utiles pour gagner du temps. P_LOGO offre la possibilité de sauvegarder et ramener des formes dans un fichier sur disque.

La primitive SAUVEFORMES <nom_de_fichier> permet de sauvegarder toutes le formes définies (celles de LISTEFORMES) sur disque. Le nom de fichier a la même syntaxe que pour SAUVE. RAMENEFORMES <nom_de_fichier> ramène et définit les formes précédemment sauvegardées.

Enfin, VIDEFORMES détruit toutes les formes définies de tortues, reste uniquement la forme par défaut.

Que c'est beau, le LOGO !

Chapître suivant


Webmaster : Sinclair ( philippe.lucidarme@wanadoo.fr ) dernière mise à jour : 1 aout1999.