Recherche

Recherche personnalisée

dimanche 29 mars 2009

Tutorial 2 Porte (1/3)

Nous allons maintenant nous attaquer à un projet légèrement plus ambitieux. Nous allons créer une porte à galindage pour éviter de nous confronter immédiatement aux rotations. Une porte à galindage se contente d'une translation, ce qui sera plus simple à gérer. Faisons un peu le point des éléments en jeu pour notre porte :


Etat porte fermée porte ouverte
Événement porte fermée porte ouverte porte touchée
Fonction ouvrir la porte fermer la porte



Je vais encore un peu insister sur la différence entre état, événement et fonction. Un état ici représente la position de la porte, celle-ci est ouverte ou fermé, on n'admet pas les états intermédiaires pour simplifier. Un événement nous indique un changement d'état, autrement dit la porte s'est ouverte ou s'est fermée. Un autre événement sert de déclencheur pour la commande de la porte, c'est le fait de toucher la porte. La fonction permet de commander l'ouverture ou la fermeture de la porte. Lorsqu'un avatar va toucher la porte "événement "porte touchée", selon son état "porte ouverte" ou "porte fermée", on va commander la fonction correspondante "fermer la porte" ou ouvrir la porte". Nous pourrions utiliser les événements "porte ouverte" et "porte fermée" pour afficher l'état au niveau du Chat, mais nous allons nous en passer parce qu'on voit très bien si la porte est ouverte ou fermée.

Maintenant que nous avons fait le point sur les modalités de quelles fonctions spécifiques avons-nous besoin pour commander la porte ? La fonction qui gère la position d'un objet est llSetPos. Vous trouvez toutes les informations sur cette fonction dans le wiki :



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



Vous constatez que cette fonction ne comporte qu'un paramètre de type vecteur. Peut-être le bon moment de s'attarder sur les types de données. Le wiki nous indique tous les types de LSL à cette page :



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



Il y a 7 types. Nous en avons déjà rencontré 2 dans le premier tutorial: le type "integer" qui est un entier compris entre -2,147,483,648 et 2,147,483,647, et le type "string" qui est une séquence de caractères que l'on place entre guillemets. Il nous faut à présent nous intéresser au type "float" qui représente une valeur décimale, autrement dit un nombre "à virgule", contrairement au type "integer". Un type "vector" est un ensemble de 3 "float" représenté sous la forme . Il ne faut pas être trop étonné de trouver des vecteur dans un monde en trois dimensions. La position dans l'espace d'un objet est définie par 3 coordonnées rassemblées dans un vecteur. Vous trouvez plus de précision sur le type "vector" dans le wiki :



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



Je fais souvent référence au wiki pour vous habituer à aller y chercher des informations. Un vecteur permet de situer la position d'un objet dans l'espace avec les coordonnées x, y et z. La fonction llSetPos permet de modifier cette position en changeant la valeur de l'une ou plusieurs de ces trois valeurs. Dans le cas de notre porte, en admettant qu'on utilise un simple prim, il nous suffira de modifier la valeur de y pour la faire glisser sur le côté. Mais la fonction llSetPos se réfère à des coordonnées régionales, comme quand vous construisez. Pour faire glisser notre porte nous avons besoin dans un premier temps de connaître ses coordonnées de départ. celles-ci nous sont fournies par la fonction llGetPos que vous trouvez ici :



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



C'est une fonction qui renvoie un vecteur contenant les coordonnées régionales de l'objet. Exactement ce dont nous avons besoin. Maintenant que nous savons obtenir la position initiale et que nous savons faire bouger notre porte que nous manque-t-il ? peut être de connaître la valeur du déplacement. l'idéal serait un peu moins que la largeur de la porte. Comment pouvons-nous la connaître ? Tout simplement avec la fonction llGetScale qui est l'équivalent de llGetPos mais pour la taille. Cette fonction renvoie un vecteur qui donne les dimensions de l'objet. Pour notre porte la largeur nous est donnée par la valeur de y. Il subsiste juste un problème pour connaître la position initiale de la porte. On va partir du principe qu'elle est fermée la première fois qu'on la touche.

Tout ceci déterminé je vous propose le code suivant que je vais vous commenter :



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
llSay(0, "porte en action"); // information
state ferme; // passe à l'état initial fermé
}
}

state ouvert // état porte ouverte
{
touch_start(integer total_number)
{
vector position = llGetPos(); // position de départ
llSetPos(position + <0, largeur, 0>); // translation
state ferme; // passage à l'état fermé
}
}

state ferme // état porte fermée
{
touch_start(integer total_number)
{
vector position = llGetPos(); // position de départ
llSetPos(position + <0, -largeur, 0>); // translation
state ouvert; // passage à l'état ouvert
}
}



La première instruction du programme sert à déclarer une variable nommée largeur de type "float". Qu'est-ce qu'une variable ? Tout simplement une boîte qui contient une valeur d'un certain type. Comme j'ai placé cette variable en tête du code, à l'extérieur de tous les états cette variable est globale, c'est-à-dire qu'elle est accessible dans tout le code. Nous avons ensuite trois état, le "default" que nous avons déjà rencontré qui correspond à l'état initial, celui qui est sollicité au démarrage du script, et deux états qui correspondent à la porte ouverte et à la porte fermée. Dans les deux états "ouvert" et "ferme" j'utilise l'événement "touch_start" qui se déclenche lorsqu'un avatar touche la porte. Quant à l'état "default" j'ai prévu un state_entry() qui se déclenche systématiquement à l'entrée dans l'état, donc au démarrage du script. Nous avons là un bloc de 4 instructions. la première instruction :

vector dimensions = llGetScale();

place dans le vecteur "dimensions" les dimensions de la porte. La deuxième instruction :

largeur = dimensions.y - (dimensions.y / 10);

détermine la largeur du déplacement en prenant la largeur de la porte qui nous est donnée par la valeur y du vecteur et en lui enlevant de manière arbitraire le dixième de sa valeur. Je n'insiste pas sur le troisième instruction que vous connaissez déjà. La quatrième instruction permet de passer à l'état "ferme". Le code est alors arrêté. La fois suivant que la porte est touchée, comme nous sommes dans l'état "ferme" c'est l'événement "touch-start" de cet état qui est concerné. La première instruction :

vector position = llGetPos();

nous donne la position actuelle de la porte. la deuxième instruction :

llSetPos(position + <0, largeur, 0>);

effectue la translation. remarquez qu'on ajoute au vecteur de la position de départ un vecteur dont les valeur x et z sont à 0 et la valeur de y à celle qui correspond au déplacement. La troisième instruction sert à passer à l'état "ouvert". Le code de cet état est équivalent au précédent avec comme seule différence le signe négatif pour le déplacement.

Il ne vous reste plus qu'à créer une jolie porte dans SL et d'ajouter ce script...

5 commentaires:

  1. Bonsoir, tous mes remerciements pour ton travail sur ce blog que j’apprécie beaucoup. C’est un plaisir à lire, très vivant et très bien fait. Bravo !
    voyance gratuite par mail

    RépondreSupprimer
  2. Merci pour ce très bon site, vraiment un panaché de bonnes et intéressantes idées. Surtout continuez ainsi. Bon courage
    Cordialement

    voyance mail gratuite ; voyance en ligne gratuite

    RépondreSupprimer
  3. Merci pour ces bons moments sur votre blog. Je suis souvent au poste pour regarder (encore et toujours) ces merveilleux articles que vous partagé. Vraiment très intéressant. Bonne continuation à vous !

    voyance gratuite serieuse

    RépondreSupprimer
  4. Je trouve ton blog très intéressant, tu donnes d’excellents conseils .
    voyance par mail gratuit

    RépondreSupprimer
  5. Tu touches un point sensible là en effet je pense aussi que c’est un manque de confiance en moi.
    voyance par mail gratuit

    RépondreSupprimer