User:Michel Lemmon/Script Propedeutico
Script Lezione PropedeuticaDescrizione: Si tratta di una lezione Propedeutica Script Pre-Requisiti: Conoscenza base di script Durata Stimata: 60 minuti Nota: Trovate qui di seguito le slide della formazione. Slide 1 Lezione PropedeuticaLezione propedeutica. Facciamo un riassunto delle informazioni minime che dovreste già sapere per poter scriptare. E' una carrellata sulle cose fondamentali: (il simbolo § indica argomenti avanzati) Gestione degli script
Sintassi del linguaggio lsl2
Libreria lsl
Come si crea uno script "New Script"Avete due sistemi:
Come si edita uno scriptCliccate sullo script nell'inventory dell'oggetto (oppure tasto destro/open) vi si apre un "editor" dove potete fare le cose tipiche che si fanno in ambiente word:
Potete fare ctrl-f per fare ricerca e sostituzioni. Ricordatevi di mettere "case insensitive". Syntax Highlighting ed help.
Quando salvate lo script vi segnala gli errori e la riga dove andare per correggerli. Se vi sono errori lo script viene salvato lo stesso ma NON è running (non fa niente!!). Running reset degli scriptPotete in ogni momento sospendere uno script cliccando sul box di "Running" e rimetterlo running successivamente. Utile per stoppare uno script che sta dando di testa. Analogamente per il reset. Il reset fa ripartire lo script da zero, PERDENDO tutti i dati che stava usando. Utile per correggere uno script che ha dato stack/collision. Le stesse operazioni possono essere fatte da Tools->Set Script running/not running in selection oppure Tools->Reset Scripts in selection. Come si debugga uno scriptCi sono virtualmente infiniti modi di verificare se uno script sta facendo quello che deve, visto che la maggior parte del tempo fa cose strane :(
E' facile scriptare un oggetto perchè ascolti sulla porta 10 e ve la rilanci come llOwnerSay. § Debug avanzatoAltri sistemi sono meno semplici da strutturare e di solito non si usano spesso:
§ Visto che le chat possono essere difficili da consultare, ho preparato un logging su un sito esterno (httplog) che potete usare per i vostri test (si vedrà meglio nella lezione httprequest). scrivete il seguente in cima al vostro script: string sURL="http://www.salahzar.info/lsl/httplog.php?pass=PASS"; debug(string k,string action,string str) { string s=sURL+"&key="+llEscapeURL(k)+"&action="+action+"&text="+llEscapeURL(str); llOwnerSay(s); llHTTPRequest(s,[],""); } Per consultarlo: www.salahzar.info/lsl/data/log_k (where k is the key you used) Impostazioni delle permissionVi sono svariate tipologie di permissions per gli oggetti:
Per gli script:
Anche le texture hanno le loro permissions. Permissions più diffuse: Un oggetto "FULL-PERMISSIONS" può essere visto, aperto, modificato, trasferito. "COPY-MODIFY" è vostro lo potete modificare ma non trasferire "MODIFY-TRANSFER" modificare, trasferire ma non copiare Per gli script le combinazioni più diffuse sono:
SINTASSI del linguaggio lsl2Tipo delle variabili
§ 32bit con segno. da -2,147,483,648 a +2,147,483,647
§ 32 bit, circa 10 cifre significative, da 10E-38 a 10E38 circa.
§ (che possono essere anche molti meno se utf-8 di lingue strane). Esempio "città" 5 caratteri utf-8, ma 6 bytes.
Variabili globali e localiAll'inizio di un programma si specificano le variabili viste globalmente ovunque. Una variabile globale quando viene modificata in un punto dello script appare modificata ovunque. Le variabili globali vengono allocate in un'area chiamata "statics". Le variabili globali vanno dichiarate PRIMA della dichiarazione degli stati Ogni funzione / stato alloca le variabili locali sullo stack. Le variabili locali usate all'interno di una funzione od evento vengono rilasciate al termine dell'evento o della funzione. E' importante distinguere fra variabili locali e globali. Confonderle può condurre ai seguenti problemi:
Per evitare confusioni, io suggerisco di usare una nomenclatura chiara, prefissando le variabili gloabli con una lettera che indica il loro tipo e mettendole tutte in maiuscolo. iNOTECARD ad esempio, vPOS, lLISTA.... FunzioniLe funzioni vanno messe prima degli stati e possono essere mischiate con le dichiarazioni di globals. Servono a rendere facilmente utilizzabile pezzi di codice che si ripete sempre uguale oppure per rendere "riciclabile" pezzi di codice che avete già fatto in altri oggetti. E' raccomandabile usare molte funzioni nel vostro codice, anche se a causa della struttura primordiale di questo linguaggio le funzioni possono rallentare e/o aumentare il consumo di memoria. In particolare ricordate che ogni volta che passate dei parametri ad una funzione, questi parametri vengono ricopiati e quindi occupano uno spazio almeno doppio. In quei casi anche se brutto, è meglio ricorrere alle variabili globali. Questo vale in particolare se avete bisogno di passare delle liste o delle stringhe molto grosse. Struttura a stati e code di eventiIl programma lsl quando entra in esecuzione è sempre in uno stato, come minimo il default state. Tutti gli eventi sono associati a quello stato se cambiate stato le code di eventi VENGONO cancellate! Per ogni evento c'è una "coda di eventi" per registrare le attività che devono essere eseguite dall'oggetto (task). La coda di eventi è limitata. § Notizia curiosa: se siete in una zona noscript il vostro programma NON è in esecuzione, ma le code di eventi continuano ad essere aggiornate (fino al loro limite). Gli eventi più importanti sono:
Costrutti elementari
Libreria lslGestione stringheFondamentali!!!
Trucco: usate s=(s="")+s+x; invece di s+=x per ridurre l'uso di memoria Funzioni matematicheLe più importanti:
Rotazioni, visto che sono fra le più difficili :)
Funzioni di gestione listeRicordatevi che le funzioni di liste non modificano MAI la lista ma ritornano sempre nel caso una lista modificata! (Questo aumenta l'uso della memoria)
(vector)llList2String(lst,index)
§ Funzioni avanzate
§ Trucco: usate lst=(lst=[])+lst+x invece di lst+=x per ridurre l'uso di memoria Funzioni di gestione eventi listeninteger handle=llListen(channel,name,id,string) => apre l'ascolto su un canale
il canale è usato anche dalla funzione llDialog (che quindi non funziona se parallelamente non è stato fatto un llListen) NB: se non si fa la llListen, l'oggetto NON gestirà l'evento listen() anche se definito!!
Usate sempre dei debug per essere sicuri di cosa state ricevendo e di come avete impostato il listener. Molti oggetti funzionano male perchè:
§ La id può essere impostata a llGetOwner () in modo che l'oggetto risponda solo all'owner. Per farla rispondere al gruppo basta inserire un test nell'evento: if(llSameGroup(id)) .... Funzioni timerllSetTimerEvent(seconds) se 0 viene disabilitato Si usa per moltissimi casi, fra cui:
Ricordate che llSetTimerEvent imposta l'evento in modo RIPETUTO, quindi se non lo spegnete l'evento si manifesta di nuovo ogni tot secondi. Funzioni di touchtouch_start(integer count) Sono lo strumento principale per gestire l'interazione con gli avatar (ce ne sono altri, mq il touch è quello che produce la MINORE quantità di lag). E' importante distinguere fra touch_start e touch. Il primo scatta solo una volta quando l'oggetto viene toccato. Touch invece continua a scattare per tutto l'intervallo di tempo in cui l'avatar mantiene cliccato il tasto sinistro del mouse. Cos'è il parametro count? Dice QUANTI avatar stanno toccando l'oggetto. In generale possiamo supporre per semplicità che ce ne sia uno soltanto e per ottenerne l'identità scriviamo key avkey=llDetectedKey(0) § ma se volessimo essere precisi dovremmo fare: for(integer i=0;i<count;i++) { key avkey=llDetectedKey(i); ... } § Altre interazioni possibili:
llDialogfunziona in pieno accordo con il touch: ecco il framework indicativo per usarlo integer iLISTEN=0; integer iCHANNEL=-3000;
key avkey=llDetectedKey(0); list options=[ "o1", "o2", "o3" ]; iLISTEN=llListen(iCHANNEL,"",avKey,""); llSetTimerEvent(60); // deve rispondere entro 60 secondi llDialog(avkey, "please say something",options,iCHANNEL); } timer() { llRemoveListener(iLISTEN); llSay(0,"Timeout please touch me again for talking"); llSetTimerEvent(0); } listen(integer channel, string name, key id, string str) { llSay(0,"you told me "+str); llSetTimerEvent(0); llRemoveListener(iLISTEN); } } Ringraziamenti |
|
Michel Lemmon 22:00, 6 march 2008(PST)