allora, iniziamo
l'idea era di far partire delle lezioni di script intermedi
che fossero produttivi
sulla lavagna vedete il programma che intendevo fare
una lezione propedeutica
(questa)
per fare un riepilogo delle varie cose
e poi una serie di lezioni
su come scriptare oggetti
ed approfondire tematiche
1: comunicare a distanza
2. rezzare oggetti
3. sensori e sonde
4. object inventory
5. lettura di notecard
6. costruzione di un vendor
poi si pensava di fare anche corsi avanzati
allora adesso vediamo le slide che ho preparato
alcune probabilmente sono banali
però le ho messe lo stesso
perchè qualcuno potrebbe non saperle
come vedete
ho cominciato proprio con come si fa uno script
poi si passa alla sintassi dello scripting
e poi si vede come funzionano alcuni comandi fondamentali
se per voi le cose sono troppo elementari, ditemelo
facciamo una piccola indagine
quanti di voi sanno bene come si fa uno script?
perfetto, allora vado un po' veloce
il sistema b) che vedete qua
"create new script" dal content di un oggetto è il più veloce,
ma ad esempio non funziona ancora con opensim
invece creare uno script nell'inventory e poi trascinarlo sul content dell'oggetto funziona sempre
anche se è un po' scomodo
quando avete lo script creato
con doppio click o con tasto destro open potete editarlo
vedere sulla lavagna gli appunti
sull'uso del copia / incolla
credo che siano cose ovvie per voi
giusto?
è utile per cercare il testo
e la sintassi viene spiegata discretamente dall'editor "embedded" nel vostro browser
passando sopra una istruzione
vi dice esattamente la sintassi e i parametri
ok, passiamo allo stato dello script
potete mettere uno script in stato NON running
per fermarne l'esecuzione
oppure fare il reset dello script
quando uno script è non running
mantiene tutte le informazioni che stava elaborando
è un po' come quando lo mettete nell'inventory
si "sospende"
quando invece gli fate il reset
perde tutte le sue informazioni
il reset è l'unico modo per ripristinare uno stato di stack/collision
vale a dire quando aveter mandato in "overflow" la memoria degli script
che come sapete è molto bassa :(
ci sono solo 16Kbyte
ma in realtà di usabili effettivamente ce ne sono molto meno
perchè bisogna lasciare spazio
con il nuovo motore MONO
lo spazio utilizzabile aumenta
ma non in modo eccezionale :(
è chiaro?
questo invece è importante
gli script hanno la tendenza a "fare i capricci"
non funzionano quasi mai al primo colpo :)
quindi occorre abituarsi all'idea di mettere istruzioni di debug
per capire cosa stanno facendo
io le metto sempre, anche quando magari non le userò
questione di abitudine
poi ognuno ha uno stile personale
quindi quello che vi dico non è detto che debba essere la "verità rivelata"
anzi
cmq, la cosa più semplice è quella di fare dire all'oggetto con llSay
in punti opportuni delle informazioni
molti usano llOwnerSay
oppure llSay(0
ad esempio llOwnerSay("Sono stato toccato, x vale "+(string)x);
è sempre bello verificare il valore delle variabili che sia quello che ci aspettiamo
qui consiglio di usare come metodo di debug un canale, il 10 che non è quello normalmente usato per chattare
e nemmeno l'ownersay
in modo tale che se per caso vi dimenticate il debug attivo
non abbiate sporcamenti sulle vostre finestre
scrivere sul canale 10
potete sempre avere un tool che vi legga il canale 10
e vi rimandi i debug a voi o sul canale 0
ad esempio il Mystitool
che io uso normalmente lo fa facilmente
è chiaro?
Il Mystitool è gratuito per i mentori, se lo desiderate inviatemi un IM alla fine
il Mystitool è pieno di cose utilissime
quindi io lo raccomando sempre
ma anche se non lo avete non è un grosso problema
sapendo scriptare si può ovviare LOL :)
ecco qui metto in colore azzurro i concetti più avanzati
si possono fare debug e tracciature usando altri sistemi oltre a llSay
ad esempio si può usare llSetText
per scrivere sulla cima di un oggetto delle informazioni preziose
ho visto script che colorano dei bottoni
per indicare che stanno elaborando
si possono mandare IM
ma la cosa più interessante è che si possono mandare le tracce
i debug su un server web esterno, con comandi http
questo è un esempio di una funzione di debug
che scrive su un sito web
e consente di vedere il tabulato
l'ho messo in blu perchè è un argomento avanzato
quindi non è necessario che lo capiate
(almeno non adesso)
prima dobbiamo fare le lezioni sull'http
ma se qualcuno è interessato, lo script php è su un mio sito web
qui l'ho messo solo per farvi vedere che si può operare in infiniti modi
www.salahzar.info è il mio dominio personale
/lsl/httplog.php è il programma php che appende una stringa su un file
usando un file che si chiama diversamente a seconda della chiave k
la traccia la si leggerà poi su un browser (firefox) con la url:
http://www.salahzar.info/lsl/httplog.php?pass=PASS&key=k&action=list
per evitare usi "abusivi" il programma risponde solo passandogli una password
questo per altro è un modello di uso "avanzato"
ma ne parleremo moolto più avanti :)
ok
qui parlo invece dei concetti legati alle permissions
suppongo che voi conosciate bene le permission più normali, giusto
?
ok, per gli script normalmente
le permission che si usano sono le "full-permissions" per prodotti opensource
che regalate a chiunque
senza scopo di lucro
mentre normalmente se volete conservare la proprietà intellettuale usate copy ma NON modify
in modo che gli acquirenti non possano vedere il vostro script o trasferirlo
l'assenza di permissions è sconsigliabile
perchè rende praticamente impossibile usare gli oggetti scriptati
l'operazione di settaggio delle permissions
almeno per me
è una delle cose più noiose
e difficili
si rischia sempre di sbagliare
togliendo troppe permissions
o lasciandone troppe
chissà se sapete di tools che consentano
di verificare le permissions
o di impostarle in modo indolore?
(questo è in comune anche con i builders etc...)
ok
adesso andiamo sulla sintassi del linguaggio
non mi soffermo troppo sui numeri
che vedete nella slide
la cosa normalmente più interessante sono le stringhe
che in lsl sono molto più complesse di quello che sembra
specie se si usano caratteri "strani"
in pratica
se usate caratteri strani come le vocali accentate
queste contano "per due"
quindi una stringa di 10 caratteri può utilizzare anche 16-20 bytes
come nell'esempio di "città"
UTF-8 è la codifica dei caratteri che usa secondlife
che è simile alla codifica ASCII per i caratteri non accentati
la codifica ASCII è quella usata dalla maggior parte dei linguaggi di programmazione
mentre l'UTF-8 è utilizzato da Java
e serve per rappresentare i caratteri + strani
ditemi se sono troppo complicato ....
ok
invece qua ci sono gli altri tipi
la key che rappresenta un oggetto, un avatar etc
ed è una specie di "stringa"
i vettori e le rotazioni
che servono per le posizioni spaziali e le rotazioni
e le liste
che sono insieme il gioiello e la croce di lsl :(
conoscete tutti questi tipi?
se avete qualche dubbio su queste cose potete chiedermi
ok allora vado
dunque le variabili
sono dei pezzi di memoria
e sono FONDAMENTALI
tutti gli script usano almeno 1 variabile per memorizzare qualcosa
anche solo per l'intervallo di qualche istruzione
in lsl
le variabili globali vanno dichiarate in testa al programma
ogni volta che qualcuno modifica una variabile globale
questa cambia
e potrebbe dare fastidio ad altre parti di programma
pensate se avete una variabile intera di nome "i"
e ne cambiate il valore quando un pezzo di codice la sta usando per fare un loop
il linguaggio lsl è difficile
perchè molti eventi accadono praticamente nello stesso momento
e quindi è fondamentale evitare che un pezzo di script "sporchi" variabili gestite da altri pezzi di codice
le variabili locali invece si possono usare liberamente senza problemi
il mio consiglio
è quello di usare una convenzione
in modo da capire subito se una variabile è globale e specificare il tipo
quindi iNOTECARD
è una variabile globale
di tipo intero
vPOS è un vettore
globale e così via
poi ci sono le funzioni
le funzioni come scritto qua
servono per "riciclare" pezzi di codice
ad esempio per scrivere qualcosa in cima al vostro oggetto potreste avere una funzione
info(str)
che magari fa una llSetText(str,<1,0,0>,1)
sono utilissime
quindi ogni volta che fate una cosa ripetutamente utilizzatele
ecco e qui veniamo alla struttua a stati
struttura
in lsl voi potete avere oggetti che hanno più di uno stato
anche se francamente
la maggior parte degli script che ho visto ne utilizzano 1 o 2 al massimo
noi faremo finta per il momento che vi sia un solo stato quello di default
quello che siete obbligati a scrivere
all'interno di un evento vi sono gli eventi + importanti
che sono quelli in basso sulla slide
- touch_start
on_rez
state_entry
listen
timer
conoscete tutti questi eventi?
qualcuno mi sa dire la differenza fra touch_start e touch?
si infatti il + importante è touch_start
(ma c'è anche il touch_end)
è quello + utilizzato e parte al momento in cui l'oggetto viene toccato
il touch(integer count)
continua ad essere chiamato finchè l'avatar continua a toccare l'oggetto
quindi diciamo ogni mezzo secondo
il che crea anche un po' di stress alla sim
quindi potreste fare uno script
che distingue le 3 fasi
se ne aveste bisogno
o che calcoli quanti secondi un avatar ha tenuto cliccato un oggetto
potrebbe essere un modo potente che so per
fare dei flipper
cmq ve l'ho fatto vedere
perchè il linguaggio di scripting di sl
pur apparentemente spartano
è in realtà ricchissimo
di cose particolari
basta solo la fantasia per farci sopra le cose + strane
ok veniamo ai costrutti elementari
ritengo che i primi li conosciate tutti
giusto?
il comando @label
e jump label
sono l'equivalente del goto
e viene utilizzato a volte per due motivi
1\ perchè risparmia bytes
2\ perchè può essere utile per uscire da un ciclo
il goto
permette di spostare l'elaborazione ad un altro punto dello script
è simile all'if then else
con la differenza che è "incondizionato"
l'if then else va al blocco else se il test non è verificato
il jump va "sempre" alla label
e di solito come dicevo viene utilizzato
per uscire da un loop
oppure da qualche programmatore pazzo e scatenato
lol
io ho visto molti pezzi di codice dei guru pieni di jump
diciamo che di solito si riesce "quasi" sempre a farne a meno :)
ma ve l'ho messo così se lo vedete lo capite
io la prima volta che l'ho visto in lsl mi ha messo un po' in crisi
e qui veniamo invece alle cose "truci"
la potenza di lsl sta nella sua libreria di funzioni
queste in questa pagina le dovreste conoscere già
uno scripter elementare dovrebbe averle già usate tutte
giusto? :)
queste invece
sono per i "guru"
mi sa che non le avete mai usate
in particolare l'ultima istruzione
studiatela bene
perchè viene usata spesso da script che hanno problemi di memoria
nella prima funzione non c'è una vera e prorpia chiave
la key
è una cosa che viene indicata anche come UUID
nella letteratura dei guru
ed è un algoritmo complessissimo
che usa il computer su cui è stata generata
la data e l'ora
e alcuni elementi casuali
le UUID sono garantite essere UNIVOCHE in tutto l'universo
(almeno sulla terra) lol
cmq si
le puoi vedere come una specie di chiave di accesso all'oggetto
qui con MD5
si intende invece un altro algoritmo diverso dall UUID
che estrae un integer
a partire da una stringa
in questo caso non si garantisce l'univocità
è un discorso un po' complesso da fare
per cui lo saltiamo adesso
ve lo facevo vedere come al solito
per farvi vedere la ricchezza del linguaggio
anche nella sua "semplicità"
se trovate da qualche parte x=(x="")+x+c;
adesso sapete cosa vuol dire?
vuol dire semplicemente l'aggiunta della stringa c alla stringa x
viene raccomandata dalla linden
per risparmiare spazio
ok
qui abbiamo invece alcune funzioni matematiche
non mi addentro
ma llFrand
può essere utile
per generare dei channel casuali
le rotazioni per il momento le lasciamo anche loro tranquille
e qui invece abbiamo funzioni sempre + interessanti
come dicevo prima le liste sono insieme il gioiello e la croce di lsl
si possono fare tantissime cose
ma spesso in modo abbastanza complesso
comunque le funzioni su questa pagina sono quelle + intuitive
tra queste le più usate
sono llGetListLength
e llList2<type>
la seconda per estrarre un elemento da una lista
queste invece sono le funzioni + avanzate
allora
in realtà molte di queste funzioni
meriterebbero una lezione a parte per ognuna di loro
io sto facendo solo una carrellata
in modo tale che almeno le abbiate già viste
poi di volta in volta quando le useremo
vi spiegherò i loro vari aspetti
delle funzioni di lista che vedete vi sono vari concetti che vi accenno
1\ strided list
sono la cosa più vicina alle "matrici"
array n-dimensionali
che lsl possa fornire
in realtà sono un trucco
ad esempio se avete una matrice di 10 righe per 2 colonne
in lsl si possono rappresentare con una lista "stirata"
ad esempio la lista
list matrix=[ "a",5,"b",6,"c",7];
potrebbe corrispondere ad una matrice di 3 righe per 2 colonne
la prima riga è "a" 5
la seconda "b" 6
ecc
questa lista viene indicata come una lista con "stride=2"
stride credo che si possa tradurre come "salto" od intervallo
quindi dice che "ogni due" parte una nuova riga
non so se ve l'ho presentato chiaramente
ok allora stop con le stride per il momento
l'altro grosso concetto
è rappresentato dalla trasformazione di una lista in stringa
e viceversa
questo è IMPORTANTISSIMO
perchè spesso nelle liste vi sono informazioni importanti
che devono essere trasmesse fra oggetti
come vedremo
e dobbiamo avere uno strumento per mandare la lista come se fosse una stringa
le funzioni più semplici per fare questo sono llList2CSV (lista=>stringa)
e llCSV2List (stringa lista)
cosa fa llListStatistics?
è una funzione molto potente
data una lista con dei valori misurati
consente di estrarre informazioni
come la media
lo scarto quadratico medio
ed altre informazioni statistiche
provate a farlo in cobol LOL
ecco
nell'ultima riga
avete invece il solito trucco
strano
lst=(lst=[])+lst+x
in particolare per le liste
una lista potrebbe essere lunga 4-5000 bytes
se non si facesse in quel modo si perderebbero 5000 bytes
lst+=x
usa 3 volte la memoria per lst
mentre la sintassi che vi ho detto usa solo 2 volte lo spazio di memoria
se avete script cicciuti
dovete sapere fare queste cose
altrimenti non vanno :)
okay ora
torniamo ad argomenti + terra terra
sicuramente avete già usato la lllisten
(con 3 elle) lol
sapete che è importante scegliere un canale
e sapete la differenza fra il canale 0, canali positivi e negativi
allora lo zero è quello che dà più fastidio
e dà anche più lag
ma anche i canali positivi sono pesanti
i canali negativi, essendo utilizzati solo dagli oggetti
generano MENO lag
ricordatevi di usare sempre la MINORE quantità possibile di llListen
NOTA: gli IM viaggiano su canali propri totalmente diversi dai canali listen
i canali negativi generano meno lag
perchè non vengono rimbalzati su tutti i browser
ma rimangono nel computer remoto
=> meno traffico di rete
questa slide
vi spiega la frustrazione
che si ha a volte
con le lllisten
avete fatto uno splendido script
ma quando gli parlate
o quando fate touch e c'è il menu
lui non fa nulla
la soluzione è una sola (a parte essere perfettissimi e non dimenticarsi nulla)
lol
mettete tante scritte di debug per essere sicuri che tutto sia come deve essere
la llListen venga fatta sul canale giusto
eccetera.
poi a volte voi stessi fate in modo che l'oggetto reagisca SOLO se siete l'owner
ad esempio io ho modificato questa lavagna
in modo che SOLO IO posso cliccarne i tasti
poi lo vediamo in apposita lezione
e siamo al timer
anche questo coso
sembra semplice
ma ho visto fare delle cose con il timer :)
comunque nel suo comportamento più semplice
fa esattamente quello che sembra
fa scattare l'evento dopo tot secondi
come scritto viene spesso utilizzato
per rimuovere un listen dopo un certo intervallo di tempo
ricordatevi che finchè non fate llSetTimerEvent(0)
il timer rimane attivo
e continua a scattare
sul touch
(forse l'evento + usato su secondlife)
mi sa che lo sapete usare tutti
mi sapete dire che cosa rappresenta quell'integer count?
c'è scritto sulla slide :)
E' il numero di avatar che tocca l'oggetto...
però la maggior parte dei programmatori
non lo considerano
e usano semplicemente llDetectedKey(0)
perchè si suppone che in circostanze normali un solo avatar tocchi l'oggetto
e noi faremo anche così (siamo pigri)
ecco cosa si dovrebbe fare
ok saltiamo le altre interazioni
la llDialog
è anche usatissima
e come vedete quasi sempre insieme a touch-start
in questa slide
vedete che elenco le opzioni
dentro una lista
e poi la llDialog visualizza il menù in alto a destra (il classico menu blu)
la llDialog ha la particolarità
che l'ordine delle scelte nella lista
corrisponde in modo "strano" a come le visualizza
nel menù
questo succede quando avete più di 3 opzioni
perchè il "maledetto" engine di sl
ordina le opzioni dal basso a sinistra verso destra
e poi va su in verticale
come se fossero coordinate X,Y
e non un testo che parte dall'alto a sinistra e poi scorre verso il basso
ci sono numerosi trucchi per ovviare a questo
se vedete questo listato
vedete che ho messo insieme un po' tutte le funzioni che vi ho descritto prima
touch_start
listen
dialog
timer
è chiaro quello che fa?
=> fa apparire un menù dando tot tempo di risposta
perfect
quella era l'ultima slide
vuol dire che adesso siete pronti per la prima lezione
Comments