Apprentissage de la programmation en P_LOGO
L'interactivité (souris, clavier, manette de jeu, menus).

 

 

Retour au sommaire

Jusque-là de nos aventures en pays Logo, on programme et l'interpréteur Logo exécute. Il peut être intéressant de pouvoir demander des informations à l'utilisateur au cours d'un programme. C'est ce que nous allons voir maintenant.

Les interactions clavier

Toutes les primitives présentées ici retournent des informations ; il s'agit donc de primitives-opérations. La première est un prédicat : TOUCHEè rends VRAI si une touche est disponible, FAUX sinon.

Par exemple, voici une petite procédure récursive qui ne s'achève que lorsqu'une touche est enfoncée :

POUR FOLIE

SI TOUCHEè [STOP]

TD HASARD 360

AV HASARD 10

FOLIE

FIN

Comme la touche enfoncée n'est pas traitée, elle reste disponible pour la suite. En exécutant ENR FOLIE et en appuyant sur la touche A, la procédure s'arrête et le caractère A.

Afin de lire la touche entrée au clavier et le traiter, on utilise soit LISCAR, soit .LISCAR. LISCAR lit la touche et rend le caractère entré. .LISCAR lit la touche et rend une valeur numérique correspondant au code ASCII du caractère entré. .LISCAR est équivalent à ASCII LISCAR. Ces deux procédures commencent par lire le clavier. Si aucune touche n'est disponible, leur exécution suspend le programme jusqu'à ce qu'une touche soit disponible.

Prenons un exemple : on veut guider la tortue grâce aux touches du pavé numérique.

DONNE "ACTION [Toutes les actions possibles de la tortue commandée par le clavier]

DPROP "ACTION "8 [AV 10 VRAI]

DPROP "ACTION "2 [RE 10 VRAI]

DPROP "ACTION "4 [TG 90 VRAI]

DPROP "ACTION "6 [TD 90 VRAI]

DPROP "ACTION "5 [LC ORIGINE BC VRAI]

DPROP "ACTION "+ [FAUX]

POUR TORTUECLAVIER

SI EXEC RPROP "ACTION LISCAR [TORTUECLAVIER]

FIN

VE ENR TORTUECLAVIER

Le tour est joué. Si en revanche, on veut faire changer la couleur de la tortue au hasard tant qu'aucune touche n'est enfoncée, il faudra utiliser le prédicat TOUCHEè.

POUR TORTUECLAVIER

FCC HASARD 16

SI TOUCHEè [SI EXEC RPROP "ACTION LISCAR [TORTUECLAVIER]] [TORTUECLAVIER]

FIN

C'est la seule manière de continuer l'exécution d'un programme tant qu'il n'y a pas de touche du clavier enfoncée.

Deux autres primitives-opérations sont disponibles : il s'agit de LISMOT et de LL (pour lisligne). LISMOT rend un mot, le premier disponible au clavier. LOGO sait que le mot est terminé par exemple lorsqu'il y a un espace. LL rend une liste, la première ligne entrée au clavier se terminant par la touche 'Entrée'.

DONNE "NOUVEAUMOT LISMOT

EC :NOUVEAUMOT

POUR DIALOGUE

EC [Comment te nommes-tu è]

TAPE [> ] SOIT "NOM LL

EC PH [Bonjour] :NOM

FIN

A vous d'imaginer d'autres utilisations. On peut reprendre les premiers numéros de Microbe dans lesquels il était question de programmation de jeux d'aventure.

Les interactions souris

De même que la tortue peut être montrée (MT) ou cachée (CT), le curseur de la souris peut apparaître (MS) ou disparaître (CS). Par défaut, il est caché.

Lorsque le curseur de la souris est à l'écran, il se déplace au gré de l'utilisateur sans aucune programmation. Des primitives-opérations nous fournissent des informations sur les actions de l'utilisateur sur la souris.

POSSOURIS rend une liste à deux éléments correspondant aux coordonnées du curseur de la souris. Le premier élément correspond à l'axe horizontal, le second à l'axe vertical. On peut aisément la rapprocher de la primitive POS qui donne la position de la tortue sur l'écran.

La primitive BOUTONè n rend VRAI si le bouton n de la souris est enfoncé, FAUX sinon. Les boutons de la souris sont numérotés de gauche à droite en partant de zéro. Pour se servir de cette primitive, il faudrait l'exécuter juste au moment où l'utilisateur appui sur le bouton. Le LOGO est souvent lent et l'opération est souvent infructueuse. Heureusement, sans programmation, LOGO se charge d'une partie des opérations : il scrute les informations en provenance de la souris et crée des événements-souris.

La primitive-opération SOURISè rend VRAI si un événement-souris s'est produit, FAUX sinon. C'est un peut l'équivalent de TOUCHEè pour le clavier. Si un événement s'est produit, on peut savoir de quoi il s'agit grâce à la primitive-opération LISSOURIS. Cette dernière rend un code suivant l'événement, dont voici les valeurs possibles :

  1. relâchement d'un bouton après un appui prolongé ;
  2. un clic ;
  3. un double-clic ;
  4. début d'appui prolongé ;
  5. un clic suivi d'un long appui ;
  6. déplacement de la souris.

Attention, si aucun événement souris non encore traité ne s'est produit, l'exécution de LISSOURIS suspend l'exécution jusqu'à ce qu'il y en ait un, avant de rendre son code.

Un petit exemple d'utilisation de la souris.

POUR DESSINE

SI SOURISè [TRAITESOURIS]

AV 15 TD 180

DESSINE

FIN

POUR TRAITESOURIS

EXEC ITEM SOMME LISSOURIS 1 [[BC] [FCC SOMME CC 1] [FPOS POSSOURIS] [LC] [] [TD PREM POSSOURIS]]

FIN

POUR DEPART

VE ENR MS DESSINE CS

FIN

Bien entendu, il est possible de dessiner des objets à l'écran et de lire la position de la souris pour savoir sur quelle figure elle se trouve. Une autre manière de faire est de dessiner des figures remplies de couleurs dissemblables. Du coup, à chaque "clic", il suffit de faire un test sur la couleur de l'écran à l'emplacement de la souris (EC CPOINT POSSOURIS). Nous reprendrons ces précieuses possibilités lors d'un exemple de programme pour faire dessiner à un cube en 3D.

De belles perspectives à venir.

Les boîtes de dialogue et les menus déroulants

Pour commencer, voici une manière bien simple d'afficher des messages dans une boîte assez jolie produite par P_LOGO :

BMESSAGE "Les_jeux_sont_faits_!

Un simple clic avec la souris ou l'appui sur une touche fait disparaître la boîte de message. En attendant, l'exécution est suspendue.

Un peu plus évoluée, la primitive-opération BQUESTION permet d'afficher une boîte de dialogue simple à deux ou trois choix (premier paramètre) et avec un message (deuxième paramètre). Les options sont "Oui" "Non" et, si le premier paramètre vaut 3, "Annulé". La valeur retournée est un nombre :

0 pour "Oui",

1 pour "Non" et

2 pour "Annulé".

Voici quelques exemples d'utilisation de cette commande :

SI ZEROè BQUESTION 2 "On_s'arrête [STOP] ; en début de procédure récursive.

EC BQUESTION 3 "Détruire_tout_è

Produit ceci à l'écran suivant :

Bien entendu, tant que l'utilisateur n'a pas choisi une des possibilités (avec un clic de la souris ou ALT+{la première lettre de l'option}), l'exécution est suspendue.

Rien de tel qu'un exemple pour illustrer la primitive-opération BLISTE. L'exécution de la ligne de commande :

EC BLISTE "Exemple [Choix1 Choix2 Choix3 Choix4]

Produit à l'écran ceci :

BLISTE rend un nombre. Si l'utilisateur a cliqué sur le mot "Annuler" (ou ALT+A), la valeur retournée est 0. Dans le cas contraire (clic sur "Valider" ou avec ALT+V), c'est le numéro de l'item marqué par une petite pyramide renversée qui est retourné.

Bref, BLISTE, c'est la manière la plus simple de réaliser des menus déroulant avec peu d'effort. Une mise en garde : le texte des options de la liste passée en second paramètre à BLISTE doit être un mot (et pas une phrase) sans guillemets ni crochets (d'où, dans l'exemple précédent, l'utilisation du caractère de soulignement _).

A vous d'essayer les commandes suivantes :

BLITFICHIER mot1 mot2 à rend un mot

C'est une primitive-opération qui affiche une boîte de dialogue qui a pour titre mot1, présentant la liste des fichiers du répertoire courant dont l’extension est mot2, rendant soit un mot vide (si l'option "Annuler" a été choisie) soit un mot correspondant au nom du fichier choisi.

BSAUVEFICHIER mot1 mot2 à rend un mot

Presque identique à BLITFICHIER, celle primitive rend le nom du fichier, avec possibilité de taper au clavier le nom. Par défaut, le nom de fichier est mot2.

De quoi embellir simplement nos programmes Logo, n'est-ce pas è

Que c'est beau, le LOGO !

Chapître suivant


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