Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement