![]() |
Apprentissage de la programmation en
P_LOGO
|
![]() |
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 !
|
|