Ce blog a pris son rythme de
croisière pour les vacances. Les possibilités
d'interaction dans SL sont un peu limitées. On peut entrer
des données par l'intermédiaire du Chat. Mais si
aucune donnée aléatoire est attendu il existe un
moyen simple et élégant d'activer les scripts, les
dialogues, ces menus au joli fond bleu qui apparaissent en haut a
droite de l'écran pour créer une interactivité
avec un jeu de boutons. Une seule fonction pour créer ces
dialogues llDialog avec quelques
paramètres dont vous trouvez la description ici :
http://www.lslwiki.net/lslwiki/wakka.php?wakka=llDialog
Pas mal d'explications ici, mais
en anglais bien entendu... En résumé la fonction
permet d'afficher le dialogue. Le premier paramètre
représente l'id de l'avatar
pour lequel ce dialogue doit être affiché. Le second
représente le message qui doit être inscrit en
tête. Le troisième contient les textes a afficher sur
les boutons. C'est ce troisième paramètre le plus
important, il a comme type une list.
Nous avons déjà eu l'occasion d'en utiliser une. Je
rappelle qu'il s'agit d'un groupe de données, dans notre cas
un ensemble de string qui
représentent ce qui doit être écrit sur les
boutons, et pas la même occasion le nombre de boutons. Le
dernier paramètre mérite une petite explication
préliminaire, à savoir ce qui se passe lorsque
l'avatar clique sur un bouton. Tout simplement le texte du bouton
est envoyé sur un canal du chat, et c'est justement ce
dernier paramètre qui définit le numéro du
canal. Je rappelle le le canal général est le 0,
surtout n'utilisez pas cette valeur sinon ça va s'afficher
pour tout le monde 
Une fois le dialogue mis en
place, puisque le résultat du clic aboutit sur un canal du
chat il faut mettre en place une écoute de ce canal avec la
fonction llListen que vous connaissez
déjà et définir l'action à accomplir
selon la valeur sélectionnée. Pour l'exemple j'ai
choisi une commande pour des vitres avec réglage de la
transparence et de la couleur, tout simplement parce que j'en ai
parlé récemment avec une amie qui a fait un superbe
script sur le sujet. J'en reprends la trame principale en le
simplifiant par souci pédagogique, entre autre... J'ai
prévu un sous-dialogue pour avoir une approche
complète. Le premier dialogue permet le réglage de la
transparence, le second de la couleur avec possibilité de
retour en arrière. Voici le code :
integer channel;
list menu;
list menu_couleurs;
vector blanc;
vector rouge;
vector vert;
vector bleu;
initialisations()
{
channel = 27;
menu = [ "Transparent", "20%", "40%", "60%", "80%",
"Opaque", "Couleur..." ];
menu_couleurs = [ "blanc", "rouge", "vert", "bleu",
"...retour" ];
blanc = <1.0,1.0,1.0>;
rouge = <1.0,0.0,0.0>;
vert = <0.0,1.0,0.0>;
bleu = <0.0,0.0,1.0>;
teinte(0);
}
teinte(float alpha)
{
integer c;
for (c = 1; c <= llGetNumberOfPrims();
c++)
llSetLinkAlpha(c, alpha, ALL_SIDES);
}
couleur (vector coul)
{
integer c;
for (c = 1; c <= llGetNumberOfPrims();
c++)
llSetLinkColor(c, coul, ALL_SIDES);
}
default
{
state_entry()
{
initialisations();
llListen(channel, "", NULL_KEY,
"");
}
touch_start(integer total_number)
{
llDialog(llDetectedKey(0), "Choisissez une option", menu,
channel);
}
listen(integer channel, string name, key id, string
message)
{
if (llListFindList(menu + menu_couleurs, [message]) !=
-1)
{
if (message == "Couleur...")
llDialog(id, "Choisissez une couleur", menu_couleurs,
channel);
else if (message == "...retour")
llDialog(id, "Choisissez une option", menu,
channel);
else if (message ==
"Transparent")
teinte(0.0);
else if (message == "Opaque")
teinte(1.0);
else if (message == "20%")
teinte(.2);
else if (message == "40%")
teinte(.4);
else if (message == "60%")
teinte(.6);
else if (message == "80%")
teinte(.8);
else if (message == "blanc")
couleur(blanc);
else if (message == "rouge")
couleur(rouge);
else if (message == "vert")
couleur(vert);
else if (message == "bleu")
couleur(bleu);
}
else
llSay(0, name + " a choisi une option non valide '" +
llToLower(message) + "'.");
}
}
Ce code s'applique à un ensemble de
prims liés, normalement des
vitres. Si vous l'utilisé pour un prim isolé il ne se passera rien pour des
raisons qui vont être explicitées plus loin. Voyons un
peu l'utilité des différents champs :
| Champ |
Type |
Fonction |
| channel |
integer |
canal du chat |
| menu |
list |
liste des options du menu
général |
| menu_couleurs |
list |
liste des options du menu des
couleurs |
| blanc |
vector |
vecteur du blanc |
| rouge |
vector |
vecteur du rouge |
| vert |
vector |
vecteur du vert |
| bleu |
vector |
vecteur du bleu |
La méthode initialisations
permet d'affecter les valeur de ces champs, elle est appelée
au lancement du script, pour bien faire il faudrait aussi l'appeler
en cas de reset mais je n'ai pas voulu alourdir le code.
La méthode teinte a pour objet de modifier l'alpha
(transparence) des prims liés.
Je rappelle que dans une liaison de prim il est affecté un
numéro à chacun qui démarre à 1, alors
qu'un prim isolé possède par défaut le
numéro 0. Le paramètre de la méthode contient
une valeur pour l'alpha qui doit se situer entre 0 (transparent) et
1 (opaque). Pour changer l'alpha de tous les prims nous avons
besoin de connaître leur nombre, c'est la fonction
llGetNumberOfPrims qui nous donne
cette valeur. Ensuite il suffit d'utiliser une boucle for pour balayer toutes les valeurs et utiliser la
fonction llSetLinkAlpha pour modifier
l'alpha du prim dont le numéro correspond à la valeur
de la variable c.
La méthode couleur suit le même principe mais le
paramètre est un vecteur qui représente la couleur et
la fonction utilisée est llSetLinkColor qui permet de changer la couleur de
prims liés.
Cette intendance étant
mise en place nous avons un seul état, celui par
défaut default. Au
départ du script (state_entry)
nous activons l'initialisation et l'écoute sur le canal
déterminé par la variable channel. C'est par ce canal que les informations
vont passer du dialog au script.
Dès qu'un avatar clique sur une vitre (touch_start) on
active le menu principal avec la fonction llDialog. Pour déterminer quel avatar a
cliqué nous utilisons la fonction llDetectedKey qui nous renvoie son id, nous prévoyons une phrase d'accueil,
nous transmettons la list qui contient
les options à afficher, en l'occurrence menu et enfin le canal par lequel transmettre
l'information (channel). Lorsque
l'avatar clique sur une des options l'événement
listen est déclenché.
C'est ici que nous allons trouver le coeur du script.
Il faut comprendre que cet
événement sera déclenché aussi pour le
sous-menu, celui des couleurs. Nous commençons par un test
pour savoir si l'information transmise sur le canal du chat
correspond à une des option des deux menus concernés.
C'est l'objet de la fonction llListFindList qui renvoie l'index de la
première instance de message dans les deux listes
menu et menu_couleur. En cas d'échec la valeur -1
et renvoyée et on transmet une information d'erreur sur le
chat. Dans le cas contraire on entame une longue série de
tests pour savoir quelle option a été choisie. S'il
s'agit d'un pourcentage (également transparent et opaque) on
appelle la méthode teinte pour
changer l'alpha. S'il s'agit d'un couleur on appelle la
méthode couleur pour changer
celle-ci. Par contre s'il s'agit de "Couleur..." il faut lancer le
sous-menu en utilisant à nouveau la fonction llDialog mais cette fois avec les bons
paramètres pour le dialogue des couleurs. Il est aussi
prévu un bouton de retour au menu principal qui se contenter
de relancer celui-ci.
Vous êtes maintenant
parés pour faire de superbes dialogues avec un nombre
quelconque de sous-dialogues. Comme vous pouvez le constater la
technique à mettre en oeuvre est simple, un bon script pour
cette fin de vacances...
Nouveauté !!! J'ai
créé un utilitaire qui génère le code
automatiquement pour les dialogues
, vous
trouvez tout ça expliqué ici :
http://script.lsl.free.fr/dialog.htm