Difference between revisions of "A Basic LSL Tutorial/it"

From Second Life Wiki
Jump to navigation Jump to search
Line 248: Line 248:
'''Compito N. 8''':
'''Compito N. 8''':
-------
-------
Now lets try make a object do something when you say something, to do this
Adesso l'oggetto farà qualcosa quando dici qualcosa. Per farlo dobbiamo usare la funzione
we will have to use a llListen function, its layout is this
llListen, la cui sintassi è questa:
llListen(integer channel, string name, key id, string msg);
llListen(integer canale, string nome, key chiave, string messaggio);
We will firstly place this under the state_entry() event.
La metteremo dentro l'evento state_entry.
In this task we will just make it use the public channel, which is 0, and we will make it
In questo compito useremo il canale pubblico, che è lo 0, e faremo in modo che l'oggetto risponda solo a te,
listen to only you, which requires the llGetOwner() function we used previously.
il che richiede l'uso della funzione llGetOwner che abbiamo visto prima.
We will then need to use a listen event, its layout is like this
Dopo di che dovremo usare l'evento listen, la cui sintassi è questa:
listen(integer channel, string name, key id, string message) {, replace the touch event with this.
listen(integer canale, string nome, key chiave, string messaggio) {, sostituite questo evento all'evento di touch iniziale.
we will then make the object annoy you by it saying "Really?" whenever you type something XD
Faremo inoltre dire all'oggetto "Davvero?" ogni volta che tu dici qualcosa ;)
This will involve using a llSay like we used in task 1.
Questo necessita l'uso di llSay come abbiamo visto nel compito N. 1.
Your script should look something like this:
Il tuo script sarà più o meno come questo:
 


<lsl>
<lsl>
Line 271: Line 272:
     {
     {


         llSay(0,"Really?");
         llSay(0,"Davvero?");
     }
     }
}
}
</lsl>
</lsl>


To make it only listen for commands not on the public channel, which will be more secret and
Se volessimo farlo ascoltare comandi che NON sono sul canale pubblico, cosa che rende più privato e produce meno lag, puoi cambiare il numero 0
which is less laggy in complex scripts, you can do this by changing the integer 0 to something
con un altro numero come ad esempio 99, e usare llOwnerSay invece di llSay, il che rende tutto molto più privato.
like 99, this time use a llOwnerSay instead of a llSay, which should make it secret.
Il tuo script sarà più o meno come questo:
Your script should look something like this:


<lsl>
<lsl>
Line 289: Line 289:
     }
     }
      
      
     listen(integer channel, string name, key id, string message)
     listen(integer canale, string name, key id, string messaggio)
     {
     {


         llOwnerSay("Really?");
         llOwnerSay("Davvero?");
     }
     }
}
}
</lsl>
</lsl>


To chat in another channel, just type in the chat bar /channel before you type something,
Per parlare in un canale differente da quello pubblico devi digitare /canale prima di quello che scrivi, in questo caso
in this case it will be "/99 hello" for example.To make it do only certain stuff when you say
devi scrivere "/99 ciao" per esempio. Se vuoi fargli fare delle cose specifiche solo quando dici un certo comando
certain commands we will have to use a if statement, like before but this time we will have
devi usare il comando "if" come abbiamo visto prima ma questa volta dobbiamo verificare ogni volta se il messaggio
to check if the message equals the command, if (message == "Your Command Here").
è uguale al comando: if(messaggio == "Qui il tuo comando").
Your script should look something like this:
Lo script sarà più o meno come questo:


<lsl>
<lsl>
Line 311: Line 311:
     }
     }
      
      
     listen(integer channel, string name, key id, string message)
     listen(integer canale, string nome, key id, string messaggio)
     {
     {
    if (message == "hello")
      if (messaggio == "ciao")
    {
      {
        llOwnerSay("Hello to you too!");
          llOwnerSay("Ciao anche a te!");
    }
      }
    else
      else
    {
      {
        llOwnerSay("INVALID COMMAND");
          llOwnerSay("COMANDO SCONOSCIUTO");
    }
      }
     }
     }
}
}
</lsl>
</lsl>


To learn more about llListen take a look at:
Per imparare di più su llListen apri questa pagina:


https://wiki.secondlife.com/wiki/llListen
https://wiki.secondlife.com/wiki/llListen


'''TASK 9''':
'''Compito N. 9''':
-------
-------
Now lets experiment with vectors, and make your object move non physically,
Adesso facciamo esperimenti con i vettori e rendiamo il tuo oggetto NON fisico,
to do this we will need to use the function llSetPos, its layout is llSetPos(vector pos);
per farlo abbiamo bisogno della nuova funzione llSetPos, la cui sintassi è llSetPos(vector pos);
We will also use llGetPos() so we can make it move +1 of its current position.
Useremo anche la funzione llGetPos() in modo da spostare l'oggetto a partire dalla sua posizione corrente.
Place the llSetPos function under a touch event with a vector <0,0,1> + llGetPos();.
Metti la funzione llSetPos sotto l'evento "touch_start" usando come parametro  <0,0,1> + llGetPos();.
Your script should look something like this:
Lo script sarà più o meno come questo:


<lsl>
<lsl>
Line 342: Line 342:
     state_entry()
     state_entry()
     {
     {
         llSay(0, "Hello, Avatar!");
         llSay(0, "Ciao, Avatar!");
     }
     }


     touch_start(integer total_number)
     touch_start(integer numero)
     {
     {
    llSetPos(llGetPos() + <0,0,1>);
        llSetPos(llGetPos() + <0,0,1>);
     }
     }
}
}
</lsl>
</lsl>


A position vector layout is in the format x,y,z, so <0,0,1> will make it go up 1m.
La sintassi per specificare un vettore è x,y,z, e quindi <0,0,1> lo farà sollevare di 1 m.
to learn more take a look at:
Per imparare di più apri questa pagina:


https://wiki.secondlife.com/wiki/llSetPos
https://wiki.secondlife.com/wiki/llSetPos


'''TASK 10''':
'''Compito N. 10''':
--------
--------
Like when editing a object you can make it Phantom, Physical...
Nello stesso modo in cui quando editi un oggetto lo puoi fare Fantasma (phantom), Fisico...
You can also do this with scripting, the function you have to use to do this is
Puoi anche farlo con gli script, la funzione che devi usare è
llSetStatus, its layout is llSetStatus(integer status, integer value);, so if i wanted
llSetStatus, la cui sintassi è llSetStatus(integer stato, integer valore);, se volessi che il mio oggetto diventi fisico
to make my object go physical the integer status would be STATUS_PHYSICS or 1, if i wanted
il numero che devo mettere al posto di stato è STATUS_PHYSICS o 1, se volessi rendere il mio oggetto fantasma dovrei usare
to make my object go phantom i would use STATUS_PHANTOM or 16.
STATUS_PHANTOM o 16.
Your script should look something like this:
Lo script sarà più o meno come questo:


<lsl>
<lsl>
Line 378: Line 378:
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------


You now know pretty much the basics of scripting,  
A questo punto conosci abbastanza le basi per lo scripting,  
but there are still many more functions to use and experiment with yet!!!!!!
ma ci sono ancora mostissime funzioni da sperimentare!!!!!!
To know more functions and what they do, take a look at these links below:
Per conoscere l'elenco delle funzione e cosa possono fare, aprite le seguenti pagine:


http://wiki.secondlife.com/wiki/LSL_Portal
http://wiki.secondlife.com/wiki/LSL_Portal

Revision as of 11:40, 8 July 2009

Tutorial di base su LSL. Fatto da James Benedek Tradotto in italiano da Salahzar Stenvaag



Quando crei uno script verrà sempre creato questo abbozzo iniziale: <lsl> default {

   state_entry()
   {
       llSay(0, "Hello, Avatar!");
   }
   touch_start(integer total_number)
   {
       llSay(0, "Touched.");
   }

} </lsl>

Questo script dice semplicemente "Hello, Avatar!" sul canale pubblico che è lo 0, e quindi dirà "Touched." sul canale pubblico quando un avatar lo tocca o lo clicca.

Come correggere gli errori?


Se in qualunque momento hai un errore mentre stai scriptando, normalmente hai dimenticato un ";" alla fine di una funzione oppure una "{" oppure "}" prima o dopo un evento. Questa è la causa più comune (errore sintattico). A volte succedono anche altre cose.

Comprensione base dei termini:


Una funzione è mostrata in rosso ((ed è un comando da far eseguire al programma come llSay))

Un "event" è mostrato in blu chiaro ((ed è una situazione che scatta ad esempio al tocco))

Una "string" sono dei caratteri e deve essere racchiusa fra apicetti "", come ad esempio "ciao eva!".

Un "integer" è un numero senza virgola come ad esempio 1

Un "vector" sono 3 numeri scritti come <0,0,0>, e può rappresentare un colore oppure una posizione.

Un "float" è un numero decimale come 1.0, usato spesso negli alfa e per i calcoli.

Una "key" è un numero UUID casuale generato dai laboratori linden come ad esempio d77442ea-5acc-4ed3-bbb4-1f2bf2c31bb6.

TRUE e FALSE, FALSE è lo stesso di 0, e TRUE è uguale all'intero 1.


Compito N. 1:


Cominciamo con il fare un semplice esercizio, facciamo una scatola che dica qualcosa d'altro quando la cliccate, per farlo basta che cambiate la scritta "llSay(0, "Touched.");". Modifica solo all'interno delle virgolette "". La sintassi di llSay è come segue: llSay(canale, "cosa dire");

llSay non è l'unica funzione che può usare l'oggetto per comunicare, puoi anche provare:

llShout(canale, "URLA QUESTO"); llWhisper(canale, "sussurra questo"); llOwnerSay("parla solo al proprietario"); llRegionSay(canale, "dì questo a tutta la regione"); // solo con canale diverso da zero


Compito N. 2:


Adesso aggiungiamo delle informazioni successive per spiegare cosa fa questo script, puoi carlo aggiungendo // e qualunque altra cosa dopo le sue barre appariranno in arancio, e rappresentano un commento. Il tuo script apparirà come segue:

<lsl> default {

   state_entry()
   {
       llSay(0, "Ciao, Avatar!"); // dì Ciao alla partenza
   }
   touch_start(integer total_number)
   {
       llSay(0, "Toccato."); // dì toccato quanto qualcuno ti tocca
   }

} </lsl>

Compito N. 3:


Adesso proviamo a fargli cambiare il colore quando qualcuno lo tocca, la funzione di cui abbiamo bisogno è llSetColor, la sua sintassi è la seguente llSetColor(vector colore, integer faccia); questo significa in pratica che se io voglio che il cubo sia rosso devo usare il vettore <1,0,0>, verde, <0,1,0>, blu <0,0,1>. Per la mappa di tutti colori vedi il link qui sotto:

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

Se fosse un oggetto linkato devi usare llSetLinkColor, la cui sintassi è llSetLinkColor(integer numerolink, vector colore, integer faccia). Il tuo script dovrebbe essere simile a questo:

<lsl> default {

   state_entry()
   {
       llSay(0, "Ciao, Avatar!");
   }
   touch_start(integer numero)
   {
   llSetColor(<1,0,0>, ALL_SIDES);
   }

} </lsl>


Compito N. 4:


Adesso facciamo in modo da visualizzare un testo SOPRA, potete farlo con la funzione llSetText, la cui sintassi è: llSetText(string testo, vector colore, float alfa-trasparenza). Fondamentalmente se scrivi llSetText("CIAO, PUOI LEGGERE QUESTO",<1,0,0>,1); Apparirà CIAO, PUOI LEGGERE QUESTO in rosso. Alfa è la trasparenza.

Se avessi fatto llSetText("CIAO, PUOI LEGGERE QUESTO",<1,0,0>,0); non riusciresti a vederlo. 0 = completamente trasparente, 0.5 = semitrasparente, 1 = nessuna trasparenza. Il tuo script dovrebbe apparire così:

<lsl> default {

   state_entry()
   {
       llSay(0, "Ciao, Avatar!");
   }
   touch_start(integer numero)
   {
   llSetText("CIAO, PUOI LEGGERE QUESTO",<1,0,0>,1);    
   }

} </lsl>

Compito N. 5:


Adesso che capisci l'alfa faremo scomparire il nostro oggetto! Per farlo useremo la funzione llSetAlpha, la cui sintassi è llSetAlpha(float alfa, integer faccia). llSetAlpha(0, ALL_SIDES); renderà tutte le facce dell'oggetto trasparenti. Se fosse un oggetto linkato dovresti usare llSetLinkAlpha, la cui sintassi è llSetLinkAlpha(integer numerolink, float alfa, integer faccia). Il tuo script dovrebbe essere così:

<lsl> default {

   state_entry()
   {
       llSay(0, "Ciao, Avatar!");
   }
   touch_start(integer numero)
   {
       llSetAlpha(0, ALL_SIDES);     
   }

} </lsl>


Compito N. 6:


Adesso facciamo in moo che il nostro oggetto si cambi la texture, per farlo useremo la funzione llSetTexture, la cui sintassi è llSetTexture(string texture, integer faccia). Puoi farlo in due modi: puoi mettere la texture dentro l'oggetto oppure usare una UUID. Per cambiare la texture che hai messo dentro l'oggetto fai così: llSetTexture("NOME DELLA TEXTURE", ALL_SIDES); Se vuoi usare una UUID, trova una texture (full permission) nel tuo inventory, fai tasto destro > copy asset UUID, e quindi fai incolla della UUID nelle virgolette "" in modo che diventi llSetTexture("j4m3s000-0000-0000-0000-b3n3d3k00000", ALL_SIDES); Se fosse un oggetto linkato dovresti usare llSetLinkTexture, la cui sintassi è llSetLinkTexture(integer numerolink, string texture, integer faccia); Il tuo script dovrebbe essere così:

<lsl> default {

   state_entry()
   {
       llSay(0, "Ciao, Avatar!");
   }
   touch_start(integer numero)
   {
   llSetTexture("NOME DELLA TEXTURE", ALL_SIDES);    
   }

} </lsl>

Compito N. 7:


Adesso facciamo qualcosa di più complesso. Se capite il concetto di "chiave UUID dell'avatar" faremo un oggetto che obbedisce solo "SE" viene cliccato dal proprietario. Questa cosa viene chiamata istruzione IF (che vuol dire "SE"). Per farlo abbiamo bisogno di usare la funzione llGetOwner() e llDetectedKey(0);, llGetOwner restituisce la UUID della vostra chiave e llDetectedKey(0) se messa nell'evento di "touch" restituisce la chiave di chi sta toccando il tuo oggetto. Per cominciare scrivi il tuo script in questo modo:

<lsl> default {

   state_entry()
   {
       llSay(0, "Ciao, Avatar!");
   }
   touch_start(integer numero)
   {
      if (llDetectedKey(0) == llGetOwner())
      {
          llSay(0, "Mi ha toccato il mio proprietario.");
      }
   
   }

} </lsl>

Se invece vuoi fare qualcosa d'altro quando qualcuno diverso dal proprietario lo tocca, devi usare l'istruzione else ("altrimenti" in inglese). Ad esempio nel seguente modo:

<lsl> default {

   state_entry()
   {
       llSay(0, "Ciao, Avatar!");
   }
   touch_start(integer numero)
   {
      if (llDetectedKey(0) == llGetOwner())
      {
          llSay(0, "Mi ha toccato il mio proprietario.");
      }
      else
      {
          llSay(0, "Non sei il mio proprietario!");
      }
   }

} </lsl>

Compito N. 8:


Adesso l'oggetto farà qualcosa quando dici qualcosa. Per farlo dobbiamo usare la funzione llListen, la cui sintassi è questa: llListen(integer canale, string nome, key chiave, string messaggio); La metteremo dentro l'evento state_entry. In questo compito useremo il canale pubblico, che è lo 0, e faremo in modo che l'oggetto risponda solo a te, il che richiede l'uso della funzione llGetOwner che abbiamo visto prima. Dopo di che dovremo usare l'evento listen, la cui sintassi è questa: listen(integer canale, string nome, key chiave, string messaggio) {, sostituite questo evento all'evento di touch iniziale. Faremo inoltre dire all'oggetto "Davvero?" ogni volta che tu dici qualcosa ;) Questo necessita l'uso di llSay come abbiamo visto nel compito N. 1. Il tuo script sarà più o meno come questo:


<lsl> default {

   state_entry()
   {
       llListen(0,"",llGetOwner(),"");
   }
   
   listen(integer channel, string name, key id, string message)
   {
       llSay(0,"Davvero?");
   }

} </lsl>

Se volessimo farlo ascoltare comandi che NON sono sul canale pubblico, cosa che rende più privato e produce meno lag, puoi cambiare il numero 0 con un altro numero come ad esempio 99, e usare llOwnerSay invece di llSay, il che rende tutto molto più privato. Il tuo script sarà più o meno come questo:

<lsl> default {

   state_entry()
   {
       llListen(99,"",llGetOwner(),"");
   }
   
   listen(integer canale, string name, key id, string messaggio)
   {
       llOwnerSay("Davvero?");
   }

} </lsl>

Per parlare in un canale differente da quello pubblico devi digitare /canale prima di quello che scrivi, in questo caso devi scrivere "/99 ciao" per esempio. Se vuoi fargli fare delle cose specifiche solo quando dici un certo comando devi usare il comando "if" come abbiamo visto prima ma questa volta dobbiamo verificare ogni volta se il messaggio è uguale al comando: if(messaggio == "Qui il tuo comando"). Lo script sarà più o meno come questo:

<lsl> default {

   state_entry()
   {
       llListen(99,"",llGetOwner(),"");
   }
   
   listen(integer canale, string nome, key id, string messaggio)
   {
      if (messaggio == "ciao")
      {
         llOwnerSay("Ciao anche a te!");
      }
      else
      {
         llOwnerSay("COMANDO SCONOSCIUTO");
      }
   }

} </lsl>

Per imparare di più su llListen apri questa pagina:

https://wiki.secondlife.com/wiki/llListen

Compito N. 9:


Adesso facciamo esperimenti con i vettori e rendiamo il tuo oggetto NON fisico, per farlo abbiamo bisogno della nuova funzione llSetPos, la cui sintassi è llSetPos(vector pos); Useremo anche la funzione llGetPos() in modo da spostare l'oggetto a partire dalla sua posizione corrente. Metti la funzione llSetPos sotto l'evento "touch_start" usando come parametro <0,0,1> + llGetPos();. Lo script sarà più o meno come questo:

<lsl> default {

   state_entry()
   {
       llSay(0, "Ciao, Avatar!");
   }
   touch_start(integer numero)
   {
       llSetPos(llGetPos() + <0,0,1>);
   }

} </lsl>

La sintassi per specificare un vettore è x,y,z, e quindi <0,0,1> lo farà sollevare di 1 m. Per imparare di più apri questa pagina:

https://wiki.secondlife.com/wiki/llSetPos

Compito N. 10:


Nello stesso modo in cui quando editi un oggetto lo puoi fare Fantasma (phantom), Fisico... Puoi anche farlo con gli script, la funzione che devi usare è llSetStatus, la cui sintassi è llSetStatus(integer stato, integer valore);, se volessi che il mio oggetto diventi fisico il numero che devo mettere al posto di stato è STATUS_PHYSICS o 1, se volessi rendere il mio oggetto fantasma dovrei usare STATUS_PHANTOM o 16. Lo script sarà più o meno come questo:

<lsl> default {

   state_entry()
   {
       llSetStatus(STATUS_PHYSICS, TRUE);
   }

} </lsl>


A questo punto conosci abbastanza le basi per lo scripting, ma ci sono ancora mostissime funzioni da sperimentare!!!!!! Per conoscere l'elenco delle funzione e cosa possono fare, aprite le seguenti pagine:

http://wiki.secondlife.com/wiki/LSL_Portal

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

http://rpgstats.com/wiki/index.php?title=Main_Page