5 novembre 2008

LSL : l'évènement listen

Après avoir passé un long moment à détailler les variables du LSL et quelques fonctions importantes, nous en avons enfin terminé avec les cours d'initiation au LSL.
Les tutoriaux qui vont suivre détailleront la création de petits scripts qui illustreront certaines fonctions ou evenements du LSL.

Le script du jour consistera à réaliser un objet extrèmement casse pied : un perroquet. Pour notre exemple, bien sur, un simple cube posé sur son épaule fera l'affaire. Ce qui m'interesse, c'est le script.
Avant d'entrer dans le vif du sujet, expliquons en gros le fonctionnement d'un script.

Un script contient un ou plusieurs états. A un instant t, seul un etat est actif. Un script contient toujours un etat nommé default, qui est l'etat par defaut, comme son nom l'indique. Cet etat doit obligatoirement être le premier etat contenu dans le script. Lorsqu'un script se met en route, c'est cet etat qui est appelé.

Exemple : un script de porte, avec deux etats : default (qui correspondra à l'etat porte fermée) et ouvert (etat pour la porte ouverte cela va de soi)
Chaque état va gerer les actions possibles du script à un moment de sa vie, de son déroulement.

Le LSL est donc un langage de scripting d'etat, mais c'est aussi un langage evenementiel, c'est à dire qui fonctionne sur le principe emeteur / récepteur d'evenement.

Un evenement est declenché, l'etat dans lequel le script se trouve peut recevoir l'evenement et le traiter, à condition qu'il soit abonner au préalable à la réception de l'évènement. Ainsi pour la gestion de nombreux evenements, nous aurons une paire fonction/evenement, la fonction abonnant l'etat à la reception d'un evenement, l'evenement accomplissant l'action désiré.



I - Quelques evenements

state_entry est l'evenement qui est appelé par le script à chaque fois que l'on entre dans un etat. De meme, state_exit, lorsque l'on sort. Ainsi, si dans le script on demande par exemple à changer d'état, avant d'entrer dans le nouvel etat, l'evenement state_exit sera appelé.

touch_start est appelé à chaque fois que on clique sur l'objet. C'est un des evenements les plus utilisés du LSL.

listen se declenche chaque fois qu'un message est envoyé sur le chat, et cela quelque soit le canal utilisé. Cet evenement nous sera donc tres utile pour notre perroquet.

timer permet de réaliser une action à interval fixe. Je veux par exemple faire clignoter une lampe. Je dois donc l'allumer puis l'eteindre, etc... toutes les 0.5 sec par exemple. On utilisera pour cela le timer.

sensor permet d'effectuer une detection. C'est grace à lui que quand vous entrez dans une boutique, vous avez le message : Welcome Deirdre Thor... Enfin, la, c'est moi qui est le message surtout....

L'evenement changed permet de détecter un changement au niveau de l'objet : liaison, inventaire, couleur, propriétaire, forme, ....

collision permet de détecter des collisions, comme son nom l'indique. Cet evenement est tres utilisé chez les marchand d'arme : quand il entre en collision avec sa cible, le missile explose....



II - Cahier des charges


Voyons à present le cahier des charges de notre perroquet.

  • On clique dessus pour le reveiller, le mettre en route (donc... touch_start)

  • Une fois réveillé, il va répéter tout ce que son propriétaire dit dans le chat (donc.... listen)

  • Si je lui dit : "zut".... il s'arrete de bavarder, et de me casser les pieds, et se rendort, attendant que je le reveille à nouveau.

  • Seul son propriétaire peut le reveiller, et il ne repete que ce que celui-ci dit.



III - Reflechissons

Notre perroquet peut dormir ou etre eveiller. Nous utiliserons donc deux etats. Il serait tout à fait possible de le faire en un seul, toutefois, il faudrait resoudre des problemes du style : je clique deux fois sur le perroquet, que se passe-t-il ?

  • Endormi : etat default

  • Eveillé : etat bavard



Mise en route du perroquet : par clic, donc utilisation d'un evenement touch_start dans l'etat default.

L'infame bavardage. Pas de doute ici, il nous faut un listen. Pour mettre notre etat en ecoute, il faudra l'abonner au listen, par la fonction llListen. Un script peut etre abonner à la reception de plusieurs listen. Pour les différentier, la fonction llListen renvoie un nombre entier correspondant au numero de l'écoute, numero que nous conserverons dans une variable. Pourquoi cela ? Quand mon perroquet va se réendormir, il n'est plus besoin de conserver l'ecoute. Donc on la supprimera grace à la fonction llListenRemove qui prend en parametre.... le numero de l'ecoute justement.
Notre llListen contiendra un filtre : le perroquet n'écoute que son maitre.

prototype de llListen : integer llListen(integer chan, string avi, key id, string msg);

  • chan : le canal de l'ecoute : pour nous il s'agira du canal 0, le chat classique, mais nous utiliserons la constante PUBLIC_CHANNEL pour plus de clarté

  • avi : le nom de l'avatar. Nous utiliserons "", la chaine vide, nous filtrerons sur la key plutot que sur le nom

  • id : la key du proprietaire du perroquet

  • msg : le message attendu pour agir. Ici, chaine vide encore, on ecoute tout ce qui est dit.



IV - Le script et ses commentaires


key avatar;
integer ecoute;


default
{
state_entry()
{
avatar = llGetOwnerKey(llGetKey());
}


touch_start(integer total_number)
{
if (llDetectedKey(0) == avatar){
state bavard;
}
}
}





state bavard{


state_entry()
{
ecoute = llListen(PUBLIC_CHANNEL, "", avatar, "");
}


listen(integer channel, string name, key id, string message)
{
if( message != "zut") llSay(PUBLIC_CHANNEL, "Coco repete : " + message );
else {
llSay(PUBLIC_CHANNEL, "Coco est fatigué, Coco va dormir");
llListenRemove(ecoute);
state default;
}
}


}




A l'entrée dans l'etat default, on recupere la key du proprietaire du perroquet. Puis le script attend qu'on clique sur le perroquet. Quand on clique, il vérifie que celui qui clique est bien le proprietaire du perroquet. Si c'est le cas, le perroquet se reveille, on passe dans l'etat bavard.

A l'entrée dans cet etat, on ouvre l'ecoute sur le canal public, pour le proprietaire.
Chaque fois que ce dernier dit quelquechose, l'evenement listen s'active. Cet evenement recoit 4 paramètres : le canal sur le quel l'ecoute est faite (channel), le nom de celui qui a parlé (name), sa clé (id), et ce qu'il a dit (message).
Si le message n'est pas "zut", le perroquet le repete dans le chat.
Sinon, il dit qu'il va se coucher, supprime l'ecoute qui n'est plus utile et change d'etat pour revenir a l'etat de sommeil, l'etat default.
De retour dans default, le perroquet attend un clic pour recommencer son cinéma et nous casser encore plus les pieds.



V - Conclusion

Voila, il ne vous reste plus qu'a copier - coller ce script dans une primitive et à le tester. C'est tout pour aujourd'hui.... Deirdre est fatiguée, Deirdre va se coucher ... Hihihi !!

Ce petit tuto avait pour but d'illustrer un exemple d'utilisation de l'evenement listen. La prochaine fois, nous travaillerons sur le timer.
N'hésitez pas a me laisser des commentaires, si des erreurs se sont glisser dans le script, ou si vous avez des envie de tutoriaux précis, ou pour m'encourager a continuer ce blog !!

Aucun commentaire: