Recherche

Recherche personnalisée

dimanche 29 mars 2009

Tutorial 12 Les Dialog

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...

4 commentaires:

  1. Je trouve votre site hyper génial, je vous souhaite pleins de succès car vous le méritez, bonne continuation et encore bravo pour ce superbe site !
    voyance par mail gratuite

    RépondreSupprimer
  2. Très bel article, je suis totalement d’accord avec toi.
    voyance gratuite en ligne par mail

    RépondreSupprimer
  3. Votre blog est une vraie mine d’infos, je suis un lecteur assidue et je vous souhaite bonne continuation.
    voyance par mail gratuite

    RépondreSupprimer
  4. Je vous remercie énormément pour toutes vos propositions sur ce site. Vos partages sont très intéressants et fort enrichissants. Félicitations à vous.

    Voyance discount

    RépondreSupprimer