Recherche

Recherche personnalisée

dimanche 29 mars 2009

Tutorial 3 Porte (2/3)

Nous allons essayer d'améliorer un peu le fonctionnement de notre porte. Tout d'abord je ne trouve pas le fait de déclencher l'ouverture en la touchant très élégant. Il serait plus sympathique de disposer d'un bouton. Ensuite ce serait bien que la fermeture de la porte s'effectue automatiquement au bout d'un certain délai. Ces deux modifications vont un peu chambouler notre code et nous obliger à considérer de nouveaux éléments. D'abord le fait de disposer d'un bouton qui est un objet séparé de la porte nous impose d'avoir deux scripts : un pour le bouton et un pour la porte, et de les faire communiquer. Commençons par régler ce point. Il existe une fonction nommée llListen qui permet d'indiquer à un objet de se mettre à l'écoute d'un canal du Chat. Voici la page du wiki qui correspond à cette fonction :


http://www.lslwiki.net/lslwiki/wakka.php?wakka=llListen



Passons un peu en revue ses paramètres. Le premier est le numéro du canal du Chat. Jusqu'ici nous avons utilisé le canal général numéroté 0. Il est possible d'utiliser bien d'autres canaux puisque ce paramètre est un integer. Les deux autres paramètres servent de filtre en désignant le nom de l'objet à écouter (deuxième paramètre) ou l'avatar à écouter (troisième paramètre). Dans notre cas nous allons appeler notre bouton tout simplement "bouton" et nous le désignerons ainsi dans cette fonction. Le quatrième paramètre enfin est la phrase attendue. L'utilisation de la fonction llListen position le script dans un état particulier nommé listen, c'est-à-dire à l'écoute du canal désigné, avec les filtres prévus et dans l'attente de la bonne phrase.

Voyons maintenant un peu le problème de la temporisation. C'est une autre fonction qui va nous tirer d'affaire : llSetTimerEvent :



http://www.lslwiki.net/lslwiki/wakka.php?wakka=llSetTimerEvent



Une fonction toute simple qui ne comporte qu'un paramètre représentant le nombre de secondes à attendre. Chaque fois que le délai est atteint un événement "timer" est déclenché. Il est temps maintenant de voir le code de la porte :



float largeur; // largeur du déplacement
default
{
state_entry()
{
vector dimensions = llGetScale(); // dimensions de la porte
largeur = dimensions.y - (dimensions.y / 10); // détermination de la largeur du déplacement
llListen(10, "bouton", NULL_KEY, "ouvrir porte");
}

listen(integer channel, string name, key id, string message) // Ouverture de la porte
{
vector position = llGetPos(); // position de départ
llSetPos(position + <0, -largeur, 0>); // translation
llSetTimerEvent(10); // On laisse ouvert 10 secondes
}

timer() // fermeture de la porte
{
vector position = llGetPos(); // position de départ
llSetPos(position + <0, largeur, 0>); // translation
llResetScript();
}
}




Un certains nombre d'éléments de ce code vous sont déjà familiers, en particulier la logique de mouvement de la porte. Je vais donc me concentrer sur les éléments nouveau. Au niveau des initialisation dans le "state_entry" la ligne important est :



llListen(10, "bouton", NULL_KEY, "ouvrir porte");



Je vous ai présenté cette fonction ci-dessus. Nous utilisons le canal 10, ce choix est parfaitement arbitraire et toute autre valeur pourrait convenir. Nous désignons le nom de l'objet qui sert de bouton, il ne faudra donc pas oublier de l'appeler ainsi si nous ne voulons pas attendre indéfiniment l'ouverture. La valeur NULL_KEY qui suit est équivalente à une chaîne de caractères vide. Enfin le message attendu est "ouvrir la porte". Dans le code suit un événement particulier nommé "listen" qui se déclenche dès que la phrase est entendu sur le bon canal prononcée le bon objet. Les deux premières lignes du code ne sont pas nouvelles pour vous, par contre la troisième mérite quelques commentaires. Je vous ai parlé ci-dessus le la fonction llSetTimerEvent. Ici nous l'utilisons après avoir ouvert la porte pour donner le départ du délai au bout duquel la porte doit se refermer. J'ai mis 10 secondes, mais vous pouvez évidemment mettre la valeur que vous voulez. Au bout du délai légèrement "timer" est déclenché. Nous fermons alors la porte avec le même code que le tutorial précédent. Par contre la dernière ligne comporte une nouvelle fonction dont le nom doit vous indiquer aisément la fonction. La fonction llResetScript remet le script dans son état initial, en quelque sorte la boucle est bouclée et on revient au "state_entry"...

Il ne nous manque plus que le code du bouton. Là ça va être on ne peut plus simple sans nouvelle fonction :



default
{
touch_start(integer total_number)
{
llSay(10, "ouvrir porte");
}
}



Un code qui se passe presque de commentaire puisque on se contente de dire ce qu'il faut sur le bon canal lorsque le bouton est touché (évenement "touch_start"). Vous n'avez plus qu'à passer à la création de la porte et du bouton pour essayer ces scripts...

3 commentaires:

  1. urtout ne changes rien, c’est merveilleux de venir sur ton site .
    Bien à Toi et bonne continuation.

    Un tout grand merci pour votre site. C’est un plaisir pour toutes & tous.
    voyance gratuite par email

    RépondreSupprimer
  2. Ton blog est formidable, travail de grande qualité... Je suis certaine que beaucoup seront d'accord avec moi même s'ils ne prennent pas le temps de te le dire.
    voyance gratuite par mail

    RépondreSupprimer
  3. J’ai sincèrement apprécié cet article qui apporte une véritable aide.
    voyance par mail rapide

    RépondreSupprimer