Mon premier script sur Second Life

Répondre
Partager Rechercher
***********************
** En Cours de validation **

***********************


L'origine de ce premier sujet a trouvé son origine ICI.

Questions:

Tout le monde peut il écrire un script?
Oui et la démo sera faite dans ce sujet

Tout le monde peut il devenir scripteur?
Pour être honnête...la seule condition est de disposer d'un niveau d'anglais (lu) correct.

Pourquoi les scripts sont ils importants ?
Tout simplement parce que SL est un monde virtuel interactif et cette interactivité est certes native dans le concept mais elle est surtout le fruit de l'exécution de scripts qui inter-agissent avec tout l'environnement.

Que faut il en théorie pour écrire ses propres scripts?


L'anglais...l'envie...le besoin...la rigueur...un dico d'anglais...un papier...un crayon...du temps...du calme...de l'imagination...de la patience...des nuits blanches...de la ténacité...connaitre les bons liens d'infos... et le copier/coller etc...

Bref un peu de tout cela

==> Un petit lien sympa pour créer des scripts sans rien connaitre ... http://www.3greeneggs.com/autoscript/index_fr.html
I. Création d'un objet
Vous allez apprendre dans un premier temps créer un objet simple:

un cube ( a box)

Dans SL un objet (Object) est dans sa plus simple expression une prim(itive).

Dans des formes plus complexes il est constitué de plusieurs prims il garde son entité d'objet mais devient multiprims tout simplement.

Un objet = Une ou plusieurs prims assemblées ensemble ( Linked)



Utilisation des menus SL pour créer un objet:


1.png

Vous avez obtenu la fenêtre 4 "Edit" c'est l'éditeur d'objet tout simplement.

Créons l'objet maintenant.

2.png

3.png

L'objet 4 est donc créé.


Prenons connaissances des infos données par cet éditeur:

Onglet Général


4.png

Les infos montrées en 2 sont importantes à connaitre pour le scripteur nous y reviendrons plus tard.

Onglet Object

6-1.png

La forme de l'objet (shape)
Les infos de géométrie de l'objet taille et inclinaisons et où se situe l'objet dans la région (sim).

Onglet Texture

6.png

Les infos sur son revêtement/habillage.

Onglet Content

7.png

Le contenu de l'objet.

Il y deux type inventaire distincts celui de l'objet et le votre.

Le terme INVENTORY dans LSL est quelque fois ambigu...

Voila votre objet est créé
Création d'un script
Pour éviter de se mélanger les crayons et concernant l'inventaire propre à l'objet les "choses" contenues dedans sont appelées:

Items

Ils representent par exemple des:

textures
sounds
landmarks
clothing
notecards
scripts
animations
gestures


et un AUTRE objet (object) peut être contenu dans le premier qui lui même peut contenir des items etc...

Pour vous donnez un symbole, une représentativité plus concrète, imaginez que l'objet est un endroit privatif ou vous pouvez stocker des éléments ( items)


Créons le script de base:

8.png

L'ouverture ( lecture) se fait en cliquant sur le nom du script (ici New Script)

La nouvelle fenêtre créée est appelée l'éditeur de script ( Script Editor) il est interne au Viewer ( il en existe un externe LSLEditor).


Manipulons l'éditeur



9.png

10.png

11.png

12.png

Comme montré vous pouvez copier / coller / Annuler tous vos chagements ou le dernier ... le refaire etc...

L'éditeur est très simple...mais aussi très pauvre en possibilités.



Revenons 10 secondes sur le menu général ( si vous avez perdu votre éditeur d'objet vous cliquez dessus bouton droit et menu edit )

et changeons le nom et description

17.png


puis sur content

clic droit sur le script et rename

16.png

18.png


Retirez maintenant l'objet du sol en le placant dans votre l'inventaire (cliquez dessus bouton droit et menu take )

15.png

Le nom de l'objet est celui inscrit.

Posons l'objet au sol.

Editons le et editons le script. Vous savez le faire désormais


24.png

Voilà!

Alors heureux?
Notions élémentaires sur LSL
Vous devez à ce stade apprendre quelques rudiments de LSL ( Linden Scripting Language )

Un script est une programmation événementielle fondée sur les événements (Events).

Le programme sera principalement défini par ses réactions aux différents événements qui peuvent se produire.

Un script est aussi appelé code réduction du terme américain Code Source.

C'est un ensemble de mots, de chiffres et de caractères assemblés pour former des instructions lisible et cohérentes

Quand sous l'éditeur vous cliquez sur Save vous compiler le code source en language machine appelé Bytecode interprétable seulement par le serveur.

Code:
C'est quoi ce serveur ? 

Pour tenter de faire simple une région / sim  n'existe pas c'est une image virtuelle  
créée / simulée/ animée/gérée etc  par des équipements informatique.

Le principale organe de cet équipement   est un PC qui émule la région  comme 
il ne le fait pas que pour lui même :)  mais pour les autres ( clients) on le nomme serveur.

Il gère la quasi totalité des évements de la région et pour revenir à nos moutons (nos scripts) 
c'est lui qui leur accorde quelques milliseconds de son ses temps CPU  pour les faire fonctionner.
Commençons l'apprentissage des bases...

Rappelez vous du symbole que j'ai donné précédemment sur l'endroit privé que pouvait représenter un objet dans son ensemble.

La symbolique (perso) que je donnerai à un script est une maison. Dont le nombre pièces est variable mais au moins UNE doit toujours être présente.

Dans LSL cette pièce se nomme "Default" et le vrai terme est un "state".

Cette state default est la PREMIERE première state qui sera adressée quand le script va être lancé ( le 1ere pièce ou l'on pénètre dans la maison).


Ce qui en langage LSL donne cela


Code PHP:

default 
{
    
state_entry()
    {
        
llSay(0"Hello, Avatar!");
    }

Le code (source) à des règles très précises vous connaissez la première apprenons la seconde

un ligne de code ne peut pas être isolée elle doit être encadrée par des accolades { (début) et } (fin).

Cela se nomme un codeblock ( bloc de code encadré par des accolades).

Note: les lignes blanches sont ignorées du compilateur ainsi que les commentaires qui sont symbolisés par deux //.

Reprenons le code

Code PHP:

// Mon premier script!!
//

default // state default qui doit être la première

{   // début du bloc code de default
   
    
state_entry()  // non d'une autre state        
    
    
{    //  début du bloc code de state_entry
        
        
llSay(0"Hello, Avatar!"); // instruction LSL
   
    
}   // début du bloc code de state_entry

}  // Fin du bloc code de default 
Paradoxalement vous imaginez que vous avez énormément à apprendre sur les scripts... et bien détrompez vous connaissez les règles de bases qui vont pouvoir vous permettre de comprendre aisément tout ce qui va suivre.

Alors toujours heureux?
Les states
Rappel un script correspond à une programmation évènementielle et je connais beaucoup de scripteurs qui ont oublié cette règle de base...

Concrètement plusieurs chose à savoir ou se rappeler:
  • La state default doit exister et être en premier.
  • Il doit exister au moins un événement dans une state sous peine d'être rappelé à l'ordre par le compilateur.
  • il existe deux événement propre aux states:
  1. state_entry
  2. state_exit
state_entry: c'est un évènement qui est déclenché / activé quand le state démarre ou est reseted (default) . C'est le 1 er point d'entrée ( la porte d'entrée dans ma symbolique)

state_exit
c'est un évènement qui est déclenché / activé quand on quitte la state. C'est le point de sortie. ( la porte sortie de la pièce dans ma symbolique )

Un exemple:

Code PHP:

default
{
    
state_entry()
    {
        
llSay(0"Je viens d'être remis à zero (Reseted in english)");
    }

IMPORTANT! : Un script est reseter dans 3 cas seulement
  1. Après la compilation ( SAVE dans l'éditeur )
  2. Par une action manuelle dans le menu edit de l'objet
  3. Par un script (fonction spéciale).
Quand je reprend mon objet dans mon inventaire le script fonctionne t il encore?

Non. Un script a 2 états possibles running or not running. Placé dans un inventaire il est Not running.

Quand je pose mon objet au sol ( Rez) l'évènement state_entry est déclenché puisque c'est le point d'entrée de la state_defaut ...


Non. LsL dispose d'un autre évènement pour bien distinguer les différents états d'un objet.

on_rez est l'évenement qui est déclenché lors d'un rez.

Perdu?

Un petit script pour bien comprendre:


Code PHP:

//
// Mon premier script
//
default
{
    
on_rez (integer params// déclenché par Rez au sol
    
{
        
llSay(0"Je viens d'être créé (Rezzed in english)"); 
    }
    
    
state_entry() // déclencher par  un reset 
    
{
        
llSay(0"Je viens d'être remis à zero (Reseted in english)");
    }
}
// end default 
Observons le résultat lors d'un rez au sol:

Code:
[2:25]  Nom de mon objet: Je viens d'être créé (Rezzed in english)
Je ne peux reseter mon script quand je rez mon objet au sol alors?

Si en utilisant une fonction spéciale :

llResetScript()

Insérons la dans le script et regardons le résultat:

Code PHP:

//
// Mon premier script
//
default
{
    
on_rez (integer params// déclenché par Rez au sol
    
{
        
llSay(0"Je viens d'être créé (Rezzed in english)"); 
        
llResetScript(); // Reset du script //
    
}
    
    
state_entry() // déclencher par  un reset 
    
{
        
llSay(0"Je viens d'être remis à zero (Reseted in english)");
    }
}
// end default 
Citation :
[2:28] Nom de mon objet: Je viens d'être créé (Rezzed in english)
[2:28] Nom de mon objet: Je viens d'être remis à zero (Reseted in english)
Magic non?


Je reviendrai longuement sur les resets des scripts et cela permettra, je l'espère une écriture différente de certains scripts..


Passons aux fameuses states...

Code PHP:

default
{
    
on_rez (integer params// déclenché par Rez au sol
    
{
        
state Oceane;
    }
    
    
state_entry()
    {
        
llSay (0"Je suis la tache principale appelez moi default");
    }
    
    
state_exit()
    {
        
llSay 0"Info: On quitte la state default");
    }
}



state Oceane
{
    
state_entry()
    {
        
llSay 0"Bonjour je suis la state: Oceane ");
        
llSay 0"je vous passe la state Sirene");
        
state Sirene;
    }
    
    
state_exit()
    {
        
llSay 0"Info: On quitte la state Oceane");
    }
}


state Sirene
{
    
state_entry()
    {
        
llSay 0"Bonjour je suis la state: Sirene ");
        
state default;
    }

Résultats
Code:
[3:26]  Nom de mon objet: Info: On quitte la state default
[3:26]  Nom de mon objet: Bonjour je suis la state: Oceane 
[3:26]  Nom de mon objet: je vous passe la state Sirene
[3:26]  Nom de mon objet: Info: On quitte la state Oceane
[3:26]  Nom de mon objet: Bonjour je suis la state: Sirene 
[3:26]  Nom de mon objet: Je suis la tache principale appelez moi default
Trop compliqué?

ok une petite photo explicative..

25.png


Bon rassurez vous on n'utilise pas tous les jours une succession de states avec des évènements de sortie de taches dans les scripts.

Toujours ici ?

Alors on continue tranquillement dans le monde des variables..
Les variables
Si il y un chapitre simple ce sera celui ci


Pour exister un variable doit être déclarée d'où le nom de déclaration de variable

(variable declaration).

2 types de déclaration possible:

Variable locale
La portée de la variable c'est à dire la zone de code où elle sera reconnue est limité au bloc code (codeblock) qui l'a déclaré et pour ceux qui ont oublié c'est le code situé entre les {}

Variable globale
Comme son nom l'indique sa portée est totale tout le code du script peut y avoir accès

Le compilateur est très strict sur les déclarations et les portées. Il est impossible de "mal déclarée" ou oublier une déclaration.

Le compilateur sera donc le meilleur des professeurs dans son domaine!

Il existe plusieurs type de variables je vais en citer que 2 ici dans ce thème.


la variable entier nombre de -2147483648 à 2147483647
Code PHP:

integer  nombre
la variable string ensemble de caractères dont le nombre est limité par la taille disponible dans le script.

Code PHP:

string    chaine
Voyons un exemple concret:

Code PHP:

// Variable Globales //
string  Nom_Du_Script "Mon premier script";  
//


default
{
    
on_rez (integer params
    {
        
llSay 0"Je lance la tache Océane dans le script: " Nom_Du_Script );
        
        
state Oceane;
    }
}



state Oceane
{
    
state_entry()
    {
        
string  nom_de_tache "Oceane"// variable locale  ... 
                                        //  appartenant au bloc state_entry de Océane
                                        
        
// pseudo bloc pour l'exemple
        
            
string variable_de_bloc " égoiste" ;
            
            
llSay (0"variable_de_bloc: " variable_de_bloc  );
            
            
llSay (0"nom_de_tache" nom_de_tache );
            
            
llSay (0"Nom_Du_Script: " Nom_Du_Script );
        }
        
        
llSay (0variable_de_bloc );
        
        
llSay 0"Bonjour je suis" nom_de_tache " dans le script:" Nom_Du_Script);        
        
    }
 

Si on compile on va avoir une erreur!

26.png

En matière de portée qui peut le plus peut le moins.

Si une variable est déclarée dans le bloc de plus haut niveau elle sera visible dans tous les blocs qu'elle contient.
A l'inverse une variable déclaré dans un bloc continu dans un autre sa portée sera limité à son bloc.

Corrigeons le script:
Code PHP:

// Variable Globales //
string  Nom_Du_Script "Mon premier script";  
//


default
{
    
on_rez (integer params
    {
        
llSay 0"Je lance la tache Océane dans le script: " Nom_Du_Script );
        
        
state Oceane;
    }
}



state Oceane
{
    
state_entry()
    {
        
string  nom_de_tache "Oceane"// variable locale  ... 
                                        //  appartenant au bloc state_entry de Océane
        
        
llSay 0"Bonjour je suis" nom_de_tache " dans le script:" Nom_Du_Script);        
        
    }
 

Si à ce stade vous avez presque tout compris continuons dans le cas inverse reprenez calmement et testez tous les scripts dans le jeu ( In Game/ i Word)
D'autres type de variables
Nous avons vu :

les strings et les integers.

Complétons par 3 autres types

Float = nombre décimal compris entre 1.175494351E-38 et 3.402823466E+38

vector = 3 nombres décimaux codé sous la forme <x,y,z>

key = une chaine de 36 caractères representant un identifiant unique appelé UUID (Universal Unique IDentifier), UID, or asset-ID. Une clef est une forme de string représentant des code hexadécimaux.

Cela semble être du chinois je sais... Pour faire simple retenez simplement que cette clef contient un identifiant servant à identifier un élement de SL.

Pour les serveurs SL tous les éléments ne sont connus que par cet identifiant :

objets, items, avatars, regions etc...

Exemple:

Code PHP:

integer Entier  12;
float   Decimal 12.12;
vector  Vecteur = < 130.12110.35102.5 >;
key     Id      "66864f3c-e095-d9c8-058d-d6575e6ed1b8";
string  Chaine  "Simple chaine"

default
{
    
touch_start(integer number
    {
        
llSay 0, (string) Entier  ); 
        
llSay 0, (string) Decimal  ); 
        
llSay 0, (string) Vecteur  ); 
        
llSay 0, (string) Id  ); 
        
llSay 0Chaine  ); 
    }

Code:
[8:48]  Nom de mon objet: 12
[8:48]  Nom de mon objet: 12.120000
[8:48]  Nom de mon objet: <130.12000, 110.35000, 102.50000>
[8:48]  Nom de mon objet: 66864f3c-e095-d9c8-058d-d6575e6ed1b8
[8:48]  Nom de mon objet: Simple chaine
Les constantes.
Les constantes LSL sont des valeurs prédéfinies il en existe environ 400!

Mais rassurez vous avec la connaissance d'une bonne dizaine vous pourrez proposez un code bien lisible.

L'utilisateur peut définir les siennes en affectant une valeur à une variable.



Exemple de constantes LSL

NULL_KEY ==> "00000000-0000-0000-0000-000000000000"

PI ==> 3.121592653

FALSE ==>0

TRUE ==> -1

Exemples possibles de constantes utilisateur;

integer CENT = 100;
integer MILLE = 1000;

string MDR = "mort de rires";
Les IF...
Nous ne verrons que quelques exemples simples...


Structure

IF ( CONDITION)
ACTION

ou

IF ( CONDITION)
ACTION VRAI
ELSE
ACTION FAUX


CONDITION = un test
ACTION = une ligne de code ou un bloc de code


Exemple

Code PHP:

integer   a 10;
integer   b 5;
integer  c 0;

if ( 
== b)
   
llSay (0"a est  égale à b");
else
   
llSay (0"a n'est pas égale à b");

if ( 
!= b
{
   
llSay (0"a n'est pas égale à b");
   
b;
}  
else
{
   
llSay (0"a est  égale à b");
   
a;   

Vous trouverez des centaines d'exemples des tests de conditions dans les supports au LSL...
Les fonctions...
Les fonctions définies par l'utilisateur doivent correspondre à une syntaxe précise et doivent être placées avant la state defaults.

A quoi sert une fonction?

A de nombreuse choses! et c'est pour cela que de ne pas en parler serait de mon sens une erreur.

1. Vu sa position dans le script ( avant la state default) permet de comprendre qu'elles sont accessibles dans tout le code.
2. Son code peut être utilisé par tous autant de fois que la sollicite
3. Permet de ne pas répéter les mêmes instructions
4. Augmenant la lisibilité
5. Permet de structurer son code
6. etc...

Exemple:

Code PHP:


// Fonctions //

string sinteger n )
{
    return (string) 
n// on recoit un integer on le convertit en string
}

string  compare_integers integer n1integer n2// on établit le rapport entre 2 integers
{
    
string result;
    
    if (
n1 == n2)     // n1 est il égal à n2 ?
        
result "egal"//  si oui  
    
else // si non
    
{
        if (
n1 n2// n1 est il supérieur alors??
            
result "supérieur";// oui
        
else
            
result "inférieur"// non alors il est inférieur! 
    
}
    return 
result;
}
// Fin Fonctions //

default
{

    
touch_start(integer total_number)
    {
        
integer a 10
        
integer b 12;
        
        
llSay ,  "a (" s(a) +  ")  est " compare_integers (a,b) + "  à b (" s(b) +")" );
        
        
21;
        
        
llSay ,  "a (" s(a) +  ")  est " compare_integers (a,b) + "  à b (" s(b) +")" );
        
    }

Résultats:

Code:
[12:18]  Nom de mon objet: a (10)  est inférieur  à b (12)
[12:18]  Nom de mon objet: a (21)  est supérieur  à b (12)
Plus explicite ici...

27.png




Voilà pour les bases et rudiments

Le dernier post traitera enfin du script promis!!
Le script !!
J'ai créé un objet qui est un générateur de structure de script spécialement pour vous.

Il vous permettra de partir sur de bonnes d'écritures.

Récupérer ce générateur sur xstreet:

https://www.xstreetsl.com/modules.ph...ItemID=1744204

Rezzed le au sol

33.png

Cliquez dessus et récupérez le code dans le chat

34.png

et copiez le dans un script vierge

35.png


Le script généré ressemble à celui ci
Code PHP:

// *****************************
// *  Afficher un drapeau et jouer l'hymne national
// *  Script écrit par Sebastien Pfalz
// *  3 Septembre 2009 
// *  Libre de reproduction
// *****************************

// .: Constantes Globales :.//
// (Type    MAJUSCULES    =    Valeur;)

// Fin de declaration Constantes //


// .: Variables Globales :.//
// (Type    Variable_Name    =    Valeur);

// Fin de declaration variables//


// .: Fonctions :.//


// Fin de  declaration fonctions //


default
{
    
on_rez(integer params)
    {
        
// Quand il y a un rez au sol
    
}
    
state_entry()
    {
        
// Quand il y a un Reset
    
}
    
touch_start(integer total_number)
    {
        
// Quand on detecte un clic
    
}
}

state  state_name
{
    
state_entry()
    {
    
// Point d'entrée
    
}

Il vous servira à créer vos premiers scripts peut être...



Maintenant définissons le petit cahier des charges de votre script final:
Code:
Nous désirons avoir un mât  sur lequel flotte un drapeau  d'un des 3 pays suivant :

France / USA / Italie

Quand on cliquera sur le drapeau on devra entendre   l'hymne du pays représenté.  
Un nouveau clic  changera de drapeau.
Quand un drapeau est présenté on devra dire bonjour dans la langue...
On annoncera aussi l'hymne joué...
Une petite vidéo vous montrera 3 drapeaux ( issus de 3 objets différents )


Sympa non?

Pour vous aider j'ai créé l'objet et chargez son inventaire il ne restera qu'à y mettre votre script... Votre premier script!

Il est disponible ici:

https://www.xstreetsl.com/modules.ph...ItemID=1744214


Rezzed le au sol il devrait ressembler à cela :

36.png


et contenir cela:
37.png
Jeu-concours
Ecriture du script
Nous allons créé le script par étape:

Résumons les données à prendre en compte:

3 Pays France / USA / Italie

3 Images des drapeaux: drapeau_francais drapeau_usa drapeau_italien

3 sons La marseillaise / Star spangled banner / Fratelli d'Italia

6 phrases : 3 bonjours + 3 annonces hymne


Déja nous pouvons charger les constantes dans le script issu du générateur de script.
Code PHP:

// *****************************
// *  Afficher un drapeau et jouer l'hymne national
// *  Script écrit par Sebastien Pfalz
// *  3 Septembre 2009 
// *  Libre de reproduction
// *****************************

// .: Constantes Globales :.//
// (Type    MAJUSCULES    =    Valeur;)

string  DRAPEAU_FRANCAIS    "drapeau_francais";       
string  DRAPEAU_USA         "drapeau_usa";            
string  DRAPEAU_ITALIEN     "drapeau_italien";        


string  HYMNE_FRANCAIS  "La marseillaise";  
string  HYMNE_USA       "Star spangled banner";  
string  HYMNE_ITALIEN   "Fratelli d'Italia"
Comme nous avons des sons à jouer ils est judicieux de les charger quand l'objet est rezzed... cela évite de les charger...quand on doit les jouer!

Créons une petit routine...
Code PHP:

// .: Fonctions :.//

init()
{
    
llPreloadSound(HYMNE_FRANCAIS);
    
llPreloadSound(HYMNE_USA);
    
llPreloadSound(HYMNE_ITALIEN);
    return;
}

// Fin de  declaration fonctions // 
une petite vérification dans le wiki

http://wiki.secondlife.com/wiki/LlPreloadSound

Nous confirme que l'argument peut être un item sound de l'inventaire de l'objet ou un UUID ( vous vous souvenez??) .
Un petit coup d'œil sur les warnings et une est importante...

This function causes the script to sleep for 1.0 seconds.


Donc pour nous 3 secondes


Lançons cette routine quand l'objet est rezzed ... déclenchant l'event on_rez ... et avertissons le user que le script est en train de bosser...


Code PHP:

on_rez(integer params)
    {
        
llOwnerSay "Initialisation lancée...");
        
init();
        
llOwnerSay "Initialisation terminée");
    } 
Posons nous 2 minutes.. réfléchissons à ce qui est imposé :

Code:
Quand on cliquera sur le drapeau ../..
Un nouveau clic  changera de drapeau.
donc nous devons utiliser l'event

Code PHP:

    touch_start(integer total_number)
    {
     } 
et comme il y aura des clics successif on devra tenter de les identfier.

L'idée d'un compteur qui s'incrémente s'impose et tester sa valeur derrière pour prendre une décision:

quelque chose comme cela

Code PHP:

    touch_start(integer total_number)
    {
        
integer  choix;

        ++
choix;  //  idem que choix = choix + 1; 
                
        
if ( choix== 0)
            (
action à determiner)
        else if ( 
choix== 1)
            (
action à determiner)
        else if ( 
choix== 2)
            (
action à determiner)
    } 
Cela semble bien... mais à la relecture quelque chose ne va pas.

l'action va certainement être externe au bloc touch_start et quand cet event va être redéclenché la valeur de la variable locale choix va être remise à zéro!

donc on va perdre la valeur ancienne!

Donc choix va devenir Globale et être nommée Choix ( Majuscule devant pour dire Globale) certain écrive gChoix etc..

autre chose 1 2 3 c'est bien mais pas parlant! Imposons nous de faire un script lisible...

Définissons des constantes rapidement sans oublier la variable globale!

Code PHP:

// .: Constantes Globales :.//
// (Type    MAJUSCULES    =    Valeur;)

string  DRAPEAU_FRANCAIS    "drapeau_francais";       
string  DRAPEAU_USA         "drapeau_usa";            
string  DRAPEAU_ITALIEN     "drapeau_italien";        


string  HYMNE_FRANCAIS  "La marseillaise";  
string  HYMNE_USA       "Star spangled banner";  
string  HYMNE_ITALIEN   "Fratelli d'Italia";  


integer FRANCE  1;
integer USA     2;
integer ITALIE  3;

// Fin de declaration Constantes //



// .: Variables Globales :.//
// (Type    Variable_Name    =    Valeur);

integer Choix


// Fin de declaration variables// 
et ré-écrivons l'event touch_start



Code PHP:

    touch_start(integer total_number)
    {
         ++
Choix;  //  idem que choix = choix + 1; 
                
        
if ( Choix == FRANCE )
            (
action à determiner)
        else if ( 
Choix == USA )
            (
action à determiner)
        else if ( 
Choix == ITALIE )
            (
action à determiner)
    } 
Déjà mieux non??

Good job..

EUhhh presque ... si le user clique 4 fois ?? on est dans les choux!!

on pourrait écrire cela

Code PHP:

if ( Choix == )  // ou (Choix > 3 )
       
Choix 0
Gardons cela à l'esprit pour le moment.

Maintenant déterminons l'action...

si il y avait que des clics pour afficher les drapeaux on pourrait afficher la texture

style

Code PHP:

        if ( Choix == FRANCE )
            
llSetTexture DRAPEAU_FRANCAISALL_SIDES);
        else if ( 
Choix == USA )
... 
mais le cahier des chardes dit :

Code:
on cliquera sur le drapeau on devra entendre   l'hymne du pays représenté.
1er clic on affiche le drapeau
2eme clic on joue l'hymne


Si on établit la chaine complète

Code:
Choix = 1  image France
Choix = 2  son  France
Choix = 3  image USA
 Choix = 4  son USA
 Choix = 5  image Italie
 Choix = 6  son Italie
cela peut jouer en effet... le nombre de "if" = nombre de drapeaux x 2.

comme on doit dire bonjour aussi chaque if aura 8 lignes

{
dire bonjour
afficher drapeau
}
{
donner le titre de l'hymne
jouer le son
}

8 * 3 choix = 24 lignes + 6 tests = 30 lignes ... pour 3 drapeaux.

Pour 5 drapeaux? 50 lignes etc...


Le code va être une succession de if ... cela va marcher mais bon..

J'opterai pour des states un petit luxe certes mais cela sera pédagogique ( c'est le but non?) et plus lisible.

A savoir qu'il existe des instructions LSL qui permettent de gérer ce type de problématique plus simplement .. demain peut être..

Définissons la tache France

Code PHP:

state France
{  
    
state_entry()
    {
        
llOwnerSay "Bonjour ;-)");
        
llSetTexture DRAPEAU_FRANCAISALL_SIDES);
    }

Dés son activation elle dit "Bonjour et charge la nouvelle texture.

relisons une dernière fois le cahier des charges et synchronisons le

Un clic changera de drapeau.
Quand un drapeau est présenté on devra dire bonjour dans la langue...
Quand on cliquera sur le drapeau on annoncera l'hymne qui est joué...

Donc on doit gérer un clic dans cette state!!

Modifions le script:

Code PHP:

state France
{  
    
touch_start(integer total_number)
    {
        
llOwnerSay "Ecouter 'La Marseillaise'");
        
llPlaySound(HYMNE_FRANCAIS,1.0);
        
state default;            
    }  
    
state_entry()
    {
        
llOwnerSay "Bonjour ;-)");
        
llSetTexture DRAPEAU_FRANCAISALL_SIDES);

    }

Good job!!

recopions ce code 3 fois en modifions les textes et variables

Code PHP:

state France
{  
    
touch_start(integer total_number)
    {
        
llOwnerSay "Ecouter 'La Marseillaise'");
        
llPlaySound(HYMNE_FRANCAIS,1.0);
        
state default;            
    }  
    
state_entry()
    {
        
llOwnerSay "Bonjour ;-)");
        
llSetTexture DRAPEAU_FRANCAISALL_SIDES);

    }
}


state Usa
{   
    
on_rez(integer params)
    {
        
llOwnerSay("kk");
    }
    
touch_start(integer total_number)
    {
        
llOwnerSay "Playing 'The star spangled banner' ");
        
llPlaySound(HYMNE_USA,1.0);
        
state default;   
    }  
    
state_entry()
    {
        
llOwnerSay "Hello! :-))" );
        
llSetTexture DRAPEAU_USAALL_SIDES);
    }
}


state Italia
{    
    
touch_start(integer total_number)
    {
        
llOwnerSay "Giocando 'Fratelli d'Italia'");
        
llPlaySound(HYMNE_ITALIEN,1.0);
        
state default;
    }  
    
state_entry()
    {
        
llOwnerSay "Bonjorno! :-))");
        
llSetTexture DRAPEAU_ITALIENALL_SIDES);
    }

Waoo quel script!

N'oublions pas 2 petites choses à régler :

si on clique quand le son à commencé à jouer on risque d'avoir la marseillaise avec le drapeau américain!

Si on limite pas le compteur Choix il va s'envoler avec le drapeaux!


on regle le problème du compteur ici :

[php]
Code PHP:

    touch_start(integer total_number)
    {
        
llOwnerSay "Giocando 'Fratelli d'Italia'");
        
llPlaySound(HYMNE_ITALIEN,1.0);
        
Choix NUL//// ICI ///
        
state default;
    } 
Apres Italie... France

et le son ici:

Code PHP:

    touch_start(integer total_number)
    {
        
llStopSound();
        ++
Choix;  //  idem que choix = choix + 1; 
Ben je crois que c'est fini ...

le script complet

Code PHP:

// *****************************
// *  Afficher un drapeau et jouer l'hymne national
// *  Script écrit par Sebastien Pfalz
// *  3 Septembre 2009 
// *  Libre de reproduction
// *****************************

// .: Constantes Globales :.//
// (Type    MAJUSCULES    =    Valeur;)

string  DRAPEAU_FRANCAIS    "drapeau_francais";       
string  DRAPEAU_USA         "drapeau_usa";            
string  DRAPEAU_ITALIEN     "drapeau_italien";        


string  HYMNE_FRANCAIS  "La marseillaise";  
string  HYMNE_USA       "Star spangled banner";  
string  HYMNE_ITALIEN   "Fratelli d'Italia";  

integer NUL     0;
integer FRANCE  1;
integer USA     2;
integer ITALIE  3;

// Fin de declaration Constantes //



// .: Variables Globales :.//
// (Type    Variable_Name    =    Valeur);

integer Choix


// Fin de declaration variables//



// .: Fonctions :.//

init()
{
    
llPreloadSound(HYMNE_FRANCAIS);
    
llPreloadSound(HYMNE_USA);
    
llPreloadSound(HYMNE_ITALIEN);
    return;
}

// Fin de  declaration fonctions //


default
{
    
on_rez(integer params)
    {
        
llOwnerSay "Initialisation lancée...");
        
init();
        
llOwnerSay "Initialisation terminée");
    }
    
    
touch_start(integer total_number)
    {
        
llStopSound();
        ++
Choix;  //  idem que choix = choix + 1; 
                
        
if ( Choix == FRANCE )
            
state France;
        else if ( 
Choix == USA )
            
state Usa;
        else if ( 
Choix == ITALIE )
            
state Italia;
    }
}


state France
{  
    
touch_start(integer total_number)
    {
        
llOwnerSay "Ecouter 'La Marseillaise'");
        
llPlaySound(HYMNE_FRANCAIS,1.0);
        
state default;            
    }  
    
state_entry()
    {
        
llOwnerSay "Bonjour ;-)");
        
llSetTexture DRAPEAU_FRANCAISALL_SIDES);

    }
}


state Usa
{   
     
touch_start(integer total_number)
    {
        
llOwnerSay "Playing 'The star spangled banner' ");
        
llPlaySound(HYMNE_USA,1.0);
        
state default;   
    }  
    
state_entry()
    {
        
llOwnerSay "Hello! :-))" );
        
llSetTexture DRAPEAU_USAALL_SIDES);
    }
}


state Italia
{    
    
touch_start(integer total_number)
    {
        
llOwnerSay "Giocando 'Fratelli d'Italia'");
        
llPlaySound(HYMNE_ITALIEN,1.0);
        
Choix NUL;
        
state default;
    }  
    
state_entry()
    {
        
llOwnerSay "Bonjorno! :-))");
        
llSetTexture DRAPEAU_ITALIENALL_SIDES);
    }

L'objet avec son script est dispo ici:

https://www.xstreetsl.com/modules.ph...ItemID=1744208

Bon tests
Conclusions:
Aux débutants:

Si vous avez compris ce premier chapitre nous vous encourageons à continuer vous avez fait un pas dans LSL mais quel pas de géant!! Croyez nous...

Vous disposez des bases pour écrire d'autres scripts de plus en plus complexes..et ludiques.

Après quelques semaines ou quelques mois si vous aviez à ré écrire ce script vous diviseriez le nombre de lignes de codes par 2 au moins! LSL est un langage puissant et riches en fonctions...

A l'équipe du LSL pour les nuls

C'est à dire tous ceux qui disposent de connaissances et sont disposés à passer quelques heures de rédactionnel,
j'attends vos remarques / critiques / suggestions mais aussi les thèmes à venir..

Chapitre 1 : Mon premier script by Seb. En attente d'approbation.
Chapitre 2 : ???
Chapitre 3: etc....
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés