11 septembre 2008

Cours d'initiation au langage LSL (III)

Plusieurs petites choses avant de commencer....

Lorsque je scripte, je ne le fais pas sur sl... j'utilise un logiciel, y écris mon code, puis hop, copier/coller dans sl.

Pourquoi ? Car le petit logiciel que j'utilise est très pratique, il y a autocomplétion du code, possibilité d'avoir accès à la page de wiki LSL de la fonction utilisée, et surtout, il y a un mode débug où je peux voir mon code tourner... une sorte de simulateur qui exécute mon code. Ultra pratique !!

Le logiciel : LSLEditor : http://www.lsleditor.org/

Dommage qu'il ne tourne que sous Zindowz (heurkkkk !! Linux power !!) et nécessite .NET Framework.
(note : je m'excuse auprès de mes lecteurs d'avoir écrit autant de gros mots en seulement une ligne)

Sinon, j'avais oublié de vous donner la page du wiki officiel de LSL : plein de docs sur toutes les fonctions, des exemples de codes, plein de bonnes choses : http://wiki.secondlife.com/wiki/LSL_Portal

Sur la page, en haut, la possibilité de choisir Français comme langage....

Bien passons aux choses sérieuses : le programme du jour.
Alors aujourd'hui : Les opérateurs, les structures de contrôles, affectations des variables



I. Les opérateurs mathématiques et l'affectation de variables numériques


Les 4 opérations mathématiques standards : + - * /
Il faut leur ajouter l'opération modulo %, qui donne le reste de la division entière.
En cas de calcul long, les priorités opératoires mathématiques sont appliquées. Si on veut les changer, l'emploie de parenthèses est indispensables.

Ainsi, on peut trouver :

integer i;
integer j;
i = 45;
j = 5;
i = i + j ;// maintenant i vaut 50 (= 45 + 5)
integer k = i/j;// k vaut 45/5 = 9
integer h = i % 10;// h est le reste de la division
// de 45 par 10.... donc h = 5
intger g = i - k*j;


Attention toutefois..... Les différents types de variables ne sont pas forcément compatibles..... Il faut dans ce cas les convertir (cast) l'un vers l'autre. Certains cast sont implicites, d'autres ne le sont pas du tout.

Exemple :

integer i = 50;
float j = i;// j vaut 50.0, 50 en valeur flottante, la conversion est implicite
// car il n'y a pas de perte de données
j = 50.36;
i = (integer)j;//conversion explicite car i vaut 50, partie entière de j.
// Ici, on perd de l'information. Donc il faut
// expliciter le cast.


Un dernier exemple piège dans lequel on tombe souvent :

float i = 2/3;


Si on demande la valeur de i... Qu'obtient-on ? On s'attend à 0.6666. Mais en fait i vaut 0 !!
Explication, je sens le mal de tête monter en vous....
2 et 3 sont des entiers.... on fait le calcul 2/3, avec des entiers, ce qui implique la division entiere qui vaut l'entier 0. Cet entier est ensuite casté en float implicitement et affecté a i. Donc i = 0.0 !!

Comment faire alors ?? Simplement écrire :

float i = 2.0/3.0;


2.0 et 3.0 sont des floats. La division est une division de floats, son résultat est donc le float 0.66666.
On affecte alors ce résultat à la variable i. CQFD !!


Oui M'dame !! C'est bien beau, mais si j'ai pas 2 et 3, mais deux variables entières k et l valant 2 et 3, et que je veux les diviser et avoir un résultat décimal ?? Je fais comment moi ? j'écris quand même pas k.0 et l.0 ??

Bien sur que non !!! M'enfin !!!
Dans ce cas, on cast explicitement : on caste chaque variables AVANT de faire la division !! Ainsi :

integer k = 2;
integer l = 3;
float i = (float)k / (float)l;


Donnons encore l'opérateur d'incrémentation et de décrémentation :

integer i = 5;
i++;// i++ équivaut à i = i+1; i vaut 6;
i--;// equivaut à i=i-1; i vaut 5


De même, pour éviter certaines formules trop longues :

integer i = 20;
i += 5;// équivalent à i = i+5;
i -= 5;// équivalent à i = i-5;
i *= 5;// équivalent à i = i*5;
i /= 5;// équivalent à i = i/5;
i %= 5;// équivalent à i = i%5;


Juste un dernier mot sur l'emploi du modulo %. A quoi peut-il servir ??

Par exemple pour convertir des secondes, en minutes et secondes :

integer t = 78;
integer min = 78/60;// 1 min
integer sec = 78%60;// et 18 sec

Ou encore pour connaitre la parité d'un nombre. Si un nombre i est pair, i%2 vaut 0, s'il est impair, i%2 vaut 1.
Car, tout nombre pair peut s'écrire sous la forme i = 2*n, et tout nombre impair sous la forme i = 2*n + 1. (pour n entier cela va de soi)




II. Les structures de controle


Note : j'utilise ici la fonction llSay. Elle permet à l'objet de parler sur un canal. Le canal 0 correspond au chat.



1) les conditions : IF.... [ELSE]

Cette structure permet de tester une condition, et d'exécuter des instructions si elle est vraie. Voir aussi d'en exécuter d'autres si elle est fausse.

if(la_condition){
instruction1;
instruction2;
} else {
instruction3;
instruction4;
}

La partie ELSE est facultative....

Je veux bien M'dame.... mais c'est quoi cette condition ?
Vous le faites exprès ou quoi ? La condition est ce que l'on teste.... Deux opérandes que l'on compare avec une opération de comparaison.

Par exemple :


i == 4 vrai si i vaut 4. Noter bien les deux ==
i > 4
i <>

Une opération de comparaison, ou plusieurs, avec des opérateurs logiques :
&& => ET, || => OU, ! => NOT


par exemple, je veux tester si i est compris entre 5 et 10....
Cela signifie que i est plus petit ou égal à 10 ET plus grand ou egal à 5. On écrira donc :

(i >= 5) && (i <= 10)


Par exemple :

if ((i >= 5) && (i <= 10)){ llSay(0, " Le nombre est compris entre 5 et 10");
}

ou encore

if ( i%2 ){
llSay(0, "Le nombre est pair");
}else {
llSay(0, "Le nombre est impair");
}


C'est tout pour aujourd'hui, vous pouvez aller prendre l'air, il fait si beau dehors ! Respirez à plein poumon.

Aucun commentaire: