22 octobre 2008

Cours d'initiation au langage LSL (VI)

Interessons nous aujourd'hui au type list....

Ce type de variable est assez particulier car il permet d'agréger ensemble des variables de types différents. Une liste, le type list, est une suite d'éléments de types divers. Ainsi je peux trouver dans une liste des string, des integer, .....
Une liste est délimitée par des crochets, et les éléments sont séparés par des virgules.

Exemple de liste :

List ma_liste = [ 12, 2.36, "un message"];


Ici : un integer (12), un float (2.36), et une string ("une message"). Chaque type est écris avec ses propres conventions : la string est encadrée par les guillemets. Si il y avait un vector, on l'écrirait entre <>....


ma_liste = [];


Par cette instruction, on vide la liste.... c'est une liste mais qui ne contient rien, c'est donc une liste vide.


On ajoute une élément à une liste en utilisant l'opérateur += (qui correspend en fait à : ma_liste = ma_liste + .......).
On remarquera que, on ajoute, en fait, à une liste une autre liste.

ma_liste += ["un pitit texte"];
ma_liste += ["un autre pitit texte", 12, <0.0,0.0,>];



Parcourir une liste

On utilisera la fonction llGetListLength qui renvoie le nombre d'éléments d'une liste. Le premier élément d'une liste à pour index 0. Et donc, le dernier, la taille de la liste moins 1.
De même, pour obtenir un element de la liste, on utilisera la fonction llList2String

Prototype des fonctions :
integer llGetListLength( list src )
string llList2String( list src, integer index )


list ma_liste = ["e1", "e2", "e3"];
integer idx;

for(idx = 0; idx < llGetListLength(ma_liste); idx++){
llSay(PUBLIC_CHANNEL, llList2String(ma_liste, idx) + " a pour index : " + (string)idx);
}


Attention toutefois... Ma liste ne contient ici que des éléments de type string..... j'utilise donc la fonction llList2String. Mais pour un integer , je dois utiliser la fonction llList2Integer, et ainsi de suite.....


Il existe bien sur des fonctions pour savoir quel est le type de l'élément qui se situe à l'index idx.... Cela permet ensuite de choisir la bonne fonction llList2.... Je vous renvoie au wiki second life consacré au LSL, et qui reste LA référence et le livre de chevet de tout bon scripteur.



Recherche

Pour savoir si une valeur est presente dans une liste, nous utiliserons la fonction llListFindList.
Prototype : integer llListFindList(list source, list element)

Exemple :

list ma_liste = ["e1", "e2", "e3"];
integer idx = llListFind list(ma_liste, ["e2"]);


Notons que l'élément recherché est passé à la fonction sous la forme d'une liste de un seul élément. Dans le cas présent, idx vaut 1.



Transformer une list en string

prototype de la fonction : string llDumpList2String( list ma_liste, string separateur);
Exemple d'utilisation :

list ma_liste = ["e1", "e2", "e3", "e4"];
string s= llDumpList2String(ma_liste, "-");
llSay(PUBLIC_CHANNEL, s);


La fonction prend une string qui correspond au séparateur que l'on souhaite mettre entre les éléments. Ici, j'ai choisi - ..... D'où l'affichage suivant dans le chat :
e1-e2-e3-e4

Ceci est parfois tres utile pour le debuggage d'un script, de maniere à savoir ce que contient une liste...

Voilà, c'est tout pour aujourd'hui........ La prochaine fois on s'attaque aux choses sérieuses !! (encore que ...)
Si vous avez des questions, des remarques, n'hesitez pas bien sur à me laisser un message. Si vous avez aussi des envies de tuto, pareil.... mais attention, je ne developpe pas de script pour autrui.... rendre service oui, faire le boulot des autres qui le reprendront, voir même qui feront un objet payant sous sl avec ce code, non merci.... ou alors je prends 80% hihihi !!
Maintenant, si c'est uen commande, alors là, c'est autre chose.... laissez moi un IM sous SL

Donc, si vous voulez faire une alarme, très bonne idée, mais ne vous attendez pas à recevoir un code entier. Par contre je me ferais un plaisir de vous faire un petit tuto sur les sensors... avec un exemple simple, qui vous aidera a réaliser votre alarme.

Voila ! c'est tout pour ce soir......

Aucun commentaire: