Advertisement
salahzar

SpeakEasy log corso scripting 05032008

Feb 16th, 2020
614
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.67 KB | None | 0 0
  1. allora, iniziamo
  2. l'idea era di far partire delle lezioni di script intermedi
  3. che fossero produttivi
  4. sulla lavagna vedete il programma che intendevo fare
  5. una lezione propedeutica
  6. (questa)
  7. per fare un riepilogo delle varie cose
  8. e poi una serie di lezioni
  9. su come scriptare oggetti
  10. ed approfondire tematiche
  11. 1: comunicare a distanza
  12. 2. rezzare oggetti
  13. 3. sensori e sonde
  14. 4. object inventory
  15. 5. lettura di notecard
  16. 6. costruzione di un vendor
  17. poi si pensava di fare anche corsi avanzati
  18. allora adesso vediamo le slide che ho preparato
  19. alcune probabilmente sono banali
  20. però le ho messe lo stesso
  21. perchè qualcuno potrebbe non saperle
  22. come vedete
  23. ho cominciato proprio con come si fa uno script
  24. poi si passa alla sintassi dello scripting
  25. e poi si vede come funzionano alcuni comandi fondamentali
  26. se per voi le cose sono troppo elementari, ditemelo
  27. facciamo una piccola indagine
  28. quanti di voi sanno bene come si fa uno script?
  29. perfetto, allora vado un po' veloce
  30. il sistema b) che vedete qua
  31. "create new script" dal content di un oggetto è il più veloce,
  32. ma ad esempio non funziona ancora con opensim
  33. invece creare uno script nell'inventory e poi trascinarlo sul content dell'oggetto funziona sempre
  34. anche se è un po' scomodo
  35. quando avete lo script creato
  36. con doppio click o con tasto destro open potete editarlo
  37. vedere sulla lavagna gli appunti
  38. sull'uso del copia / incolla
  39. credo che siano cose ovvie per voi
  40. giusto?
  41. è utile per cercare il testo
  42. e la sintassi viene spiegata discretamente dall'editor "embedded" nel vostro browser
  43. passando sopra una istruzione
  44. vi dice esattamente la sintassi e i parametri
  45. ok, passiamo allo stato dello script
  46. potete mettere uno script in stato NON running
  47. per fermarne l'esecuzione
  48. oppure fare il reset dello script
  49. quando uno script è non running
  50. mantiene tutte le informazioni che stava elaborando
  51. è un po' come quando lo mettete nell'inventory
  52. si "sospende"
  53. quando invece gli fate il reset
  54. perde tutte le sue informazioni
  55. il reset è l'unico modo per ripristinare uno stato di stack/collision
  56. vale a dire quando aveter mandato in "overflow" la memoria degli script
  57. che come sapete è molto bassa :(
  58. ci sono solo 16Kbyte
  59. ma in realtà di usabili effettivamente ce ne sono molto meno
  60. perchè bisogna lasciare spazio
  61. con il nuovo motore MONO
  62. lo spazio utilizzabile aumenta
  63. ma non in modo eccezionale :(
  64. è chiaro?
  65. questo invece è importante
  66. gli script hanno la tendenza a "fare i capricci"
  67. non funzionano quasi mai al primo colpo :)
  68. quindi occorre abituarsi all'idea di mettere istruzioni di debug
  69. per capire cosa stanno facendo
  70. io le metto sempre, anche quando magari non le userò
  71. questione di abitudine
  72. poi ognuno ha uno stile personale
  73. quindi quello che vi dico non è detto che debba essere la "verità rivelata"
  74. anzi
  75. cmq, la cosa più semplice è quella di fare dire all'oggetto con llSay
  76. in punti opportuni delle informazioni
  77. molti usano llOwnerSay
  78. oppure llSay(0
  79. ad esempio llOwnerSay("Sono stato toccato, x vale "+(string)x);
  80. è sempre bello verificare il valore delle variabili che sia quello che ci aspettiamo
  81. qui consiglio di usare come metodo di debug un canale, il 10 che non è quello normalmente usato per chattare
  82. e nemmeno l'ownersay
  83. in modo tale che se per caso vi dimenticate il debug attivo
  84. non abbiate sporcamenti sulle vostre finestre
  85. scrivere sul canale 10
  86. potete sempre avere un tool che vi legga il canale 10
  87. e vi rimandi i debug a voi o sul canale 0
  88. ad esempio il Mystitool
  89. che io uso normalmente lo fa facilmente
  90. è chiaro?
  91. Il Mystitool è gratuito per i mentori, se lo desiderate inviatemi un IM alla fine
  92. il Mystitool è pieno di cose utilissime
  93. quindi io lo raccomando sempre
  94. ma anche se non lo avete non è un grosso problema
  95. sapendo scriptare si può ovviare LOL :)
  96. ecco qui metto in colore azzurro i concetti più avanzati
  97. si possono fare debug e tracciature usando altri sistemi oltre a llSay
  98. ad esempio si può usare llSetText
  99. per scrivere sulla cima di un oggetto delle informazioni preziose
  100. ho visto script che colorano dei bottoni
  101. per indicare che stanno elaborando
  102. si possono mandare IM
  103. ma la cosa più interessante è che si possono mandare le tracce
  104. i debug su un server web esterno, con comandi http
  105. questo è un esempio di una funzione di debug
  106. che scrive su un sito web
  107. e consente di vedere il tabulato
  108. l'ho messo in blu perchè è un argomento avanzato
  109. quindi non è necessario che lo capiate
  110. (almeno non adesso)
  111. prima dobbiamo fare le lezioni sull'http
  112. ma se qualcuno è interessato, lo script php è su un mio sito web
  113. qui l'ho messo solo per farvi vedere che si può operare in infiniti modi
  114. www.salahzar.info è il mio dominio personale
  115. /lsl/httplog.php è il programma php che appende una stringa su un file
  116. usando un file che si chiama diversamente a seconda della chiave k
  117. la traccia la si leggerà poi su un browser (firefox) con la url:
  118. http://www.salahzar.info/lsl/httplog.php?pass=PASS&key=k&action=list
  119. per evitare usi "abusivi" il programma risponde solo passandogli una password
  120. questo per altro è un modello di uso "avanzato"
  121. ma ne parleremo moolto più avanti :)
  122. ok
  123. qui parlo invece dei concetti legati alle permissions
  124. suppongo che voi conosciate bene le permission più normali, giusto
  125. ?
  126. ok, per gli script normalmente
  127. le permission che si usano sono le "full-permissions" per prodotti opensource
  128. che regalate a chiunque
  129. senza scopo di lucro
  130. mentre normalmente se volete conservare la proprietà intellettuale usate copy ma NON modify
  131. in modo che gli acquirenti non possano vedere il vostro script o trasferirlo
  132. l'assenza di permissions è sconsigliabile
  133. perchè rende praticamente impossibile usare gli oggetti scriptati
  134. l'operazione di settaggio delle permissions
  135. almeno per me
  136. è una delle cose più noiose
  137. e difficili
  138. si rischia sempre di sbagliare
  139. togliendo troppe permissions
  140. o lasciandone troppe
  141. chissà se sapete di tools che consentano
  142. di verificare le permissions
  143. o di impostarle in modo indolore?
  144. (questo è in comune anche con i builders etc...)
  145. ok
  146. adesso andiamo sulla sintassi del linguaggio
  147. non mi soffermo troppo sui numeri
  148. che vedete nella slide
  149. la cosa normalmente più interessante sono le stringhe
  150. che in lsl sono molto più complesse di quello che sembra
  151. specie se si usano caratteri "strani"
  152. in pratica
  153. se usate caratteri strani come le vocali accentate
  154. queste contano "per due"
  155. quindi una stringa di 10 caratteri può utilizzare anche 16-20 bytes
  156. come nell'esempio di "città"
  157. UTF-8 è la codifica dei caratteri che usa secondlife
  158. che è simile alla codifica ASCII per i caratteri non accentati
  159. la codifica ASCII è quella usata dalla maggior parte dei linguaggi di programmazione
  160. mentre l'UTF-8 è utilizzato da Java
  161. e serve per rappresentare i caratteri + strani
  162. ditemi se sono troppo complicato ....
  163. ok
  164. invece qua ci sono gli altri tipi
  165. la key che rappresenta un oggetto, un avatar etc
  166. ed è una specie di "stringa"
  167. i vettori e le rotazioni
  168. che servono per le posizioni spaziali e le rotazioni
  169. e le liste
  170. che sono insieme il gioiello e la croce di lsl :(
  171. conoscete tutti questi tipi?
  172. se avete qualche dubbio su queste cose potete chiedermi
  173. ok allora vado
  174. dunque le variabili
  175. sono dei pezzi di memoria
  176. e sono FONDAMENTALI
  177. tutti gli script usano almeno 1 variabile per memorizzare qualcosa
  178. anche solo per l'intervallo di qualche istruzione
  179. in lsl
  180. le variabili globali vanno dichiarate in testa al programma
  181. ogni volta che qualcuno modifica una variabile globale
  182. questa cambia
  183. e potrebbe dare fastidio ad altre parti di programma
  184. pensate se avete una variabile intera di nome "i"
  185. e ne cambiate il valore quando un pezzo di codice la sta usando per fare un loop
  186. il linguaggio lsl è difficile
  187. perchè molti eventi accadono praticamente nello stesso momento
  188. e quindi è fondamentale evitare che un pezzo di script "sporchi" variabili gestite da altri pezzi di codice
  189. le variabili locali invece si possono usare liberamente senza problemi
  190. il mio consiglio
  191. è quello di usare una convenzione
  192. in modo da capire subito se una variabile è globale e specificare il tipo
  193. quindi iNOTECARD
  194. è una variabile globale
  195. di tipo intero
  196. vPOS è un vettore
  197. globale e così via
  198. poi ci sono le funzioni
  199. le funzioni come scritto qua
  200. servono per "riciclare" pezzi di codice
  201. ad esempio per scrivere qualcosa in cima al vostro oggetto potreste avere una funzione
  202. info(str)
  203. che magari fa una llSetText(str,<1,0,0>,1)
  204. sono utilissime
  205. quindi ogni volta che fate una cosa ripetutamente utilizzatele
  206. ecco e qui veniamo alla struttua a stati
  207. struttura
  208. in lsl voi potete avere oggetti che hanno più di uno stato
  209. anche se francamente
  210. la maggior parte degli script che ho visto ne utilizzano 1 o 2 al massimo
  211. noi faremo finta per il momento che vi sia un solo stato quello di default
  212. quello che siete obbligati a scrivere
  213. all'interno di un evento vi sono gli eventi + importanti
  214. che sono quelli in basso sulla slide
  215. - touch_start
  216. on_rez
  217. state_entry
  218. listen
  219. timer
  220. conoscete tutti questi eventi?
  221. qualcuno mi sa dire la differenza fra touch_start e touch?
  222. si infatti il + importante è touch_start
  223. (ma c'è anche il touch_end)
  224. è quello + utilizzato e parte al momento in cui l'oggetto viene toccato
  225. il touch(integer count)
  226. continua ad essere chiamato finchè l'avatar continua a toccare l'oggetto
  227. quindi diciamo ogni mezzo secondo
  228. il che crea anche un po' di stress alla sim
  229. quindi potreste fare uno script
  230. che distingue le 3 fasi
  231. se ne aveste bisogno
  232. o che calcoli quanti secondi un avatar ha tenuto cliccato un oggetto
  233. potrebbe essere un modo potente che so per
  234. fare dei flipper
  235. cmq ve l'ho fatto vedere
  236. perchè il linguaggio di scripting di sl
  237. pur apparentemente spartano
  238. è in realtà ricchissimo
  239. di cose particolari
  240. basta solo la fantasia per farci sopra le cose + strane
  241. ok veniamo ai costrutti elementari
  242. ritengo che i primi li conosciate tutti
  243. giusto?
  244. il comando @label
  245. e jump label
  246. sono l'equivalente del goto
  247. e viene utilizzato a volte per due motivi
  248. 1\ perchè risparmia bytes
  249. 2\ perchè può essere utile per uscire da un ciclo
  250. il goto
  251. permette di spostare l'elaborazione ad un altro punto dello script
  252. è simile all'if then else
  253. con la differenza che è "incondizionato"
  254. l'if then else va al blocco else se il test non è verificato
  255. il jump va "sempre" alla label
  256. e di solito come dicevo viene utilizzato
  257. per uscire da un loop
  258. oppure da qualche programmatore pazzo e scatenato
  259. lol
  260. io ho visto molti pezzi di codice dei guru pieni di jump
  261. diciamo che di solito si riesce "quasi" sempre a farne a meno :)
  262. ma ve l'ho messo così se lo vedete lo capite
  263. io la prima volta che l'ho visto in lsl mi ha messo un po' in crisi
  264. e qui veniamo invece alle cose "truci"
  265. la potenza di lsl sta nella sua libreria di funzioni
  266. queste in questa pagina le dovreste conoscere già
  267. uno scripter elementare dovrebbe averle già usate tutte
  268. giusto? :)
  269. queste invece
  270. sono per i "guru"
  271. mi sa che non le avete mai usate
  272. in particolare l'ultima istruzione
  273. studiatela bene
  274. perchè viene usata spesso da script che hanno problemi di memoria
  275. nella prima funzione non c'è una vera e prorpia chiave
  276. la key
  277. è una cosa che viene indicata anche come UUID
  278. nella letteratura dei guru
  279. ed è un algoritmo complessissimo
  280. che usa il computer su cui è stata generata
  281. la data e l'ora
  282. e alcuni elementi casuali
  283. le UUID sono garantite essere UNIVOCHE in tutto l'universo
  284. (almeno sulla terra) lol
  285. cmq si
  286. le puoi vedere come una specie di chiave di accesso all'oggetto
  287. qui con MD5
  288. si intende invece un altro algoritmo diverso dall UUID
  289. che estrae un integer
  290. a partire da una stringa
  291. in questo caso non si garantisce l'univocità
  292. è un discorso un po' complesso da fare
  293. per cui lo saltiamo adesso
  294. ve lo facevo vedere come al solito
  295. per farvi vedere la ricchezza del linguaggio
  296. anche nella sua "semplicità"
  297. se trovate da qualche parte x=(x="")+x+c;
  298. adesso sapete cosa vuol dire?
  299. vuol dire semplicemente l'aggiunta della stringa c alla stringa x
  300. viene raccomandata dalla linden
  301. per risparmiare spazio
  302. ok
  303. qui abbiamo invece alcune funzioni matematiche
  304. non mi addentro
  305. ma llFrand
  306. può essere utile
  307. per generare dei channel casuali
  308. le rotazioni per il momento le lasciamo anche loro tranquille
  309. e qui invece abbiamo funzioni sempre + interessanti
  310. come dicevo prima le liste sono insieme il gioiello e la croce di lsl
  311. si possono fare tantissime cose
  312. ma spesso in modo abbastanza complesso
  313. comunque le funzioni su questa pagina sono quelle + intuitive
  314. tra queste le più usate
  315. sono llGetListLength
  316. e llList2<type>
  317. la seconda per estrarre un elemento da una lista
  318. queste invece sono le funzioni + avanzate
  319. allora
  320. in realtà molte di queste funzioni
  321. meriterebbero una lezione a parte per ognuna di loro
  322. io sto facendo solo una carrellata
  323. in modo tale che almeno le abbiate già viste
  324. poi di volta in volta quando le useremo
  325. vi spiegherò i loro vari aspetti
  326. delle funzioni di lista che vedete vi sono vari concetti che vi accenno
  327. 1\ strided list
  328. sono la cosa più vicina alle "matrici"
  329. array n-dimensionali
  330. che lsl possa fornire
  331. in realtà sono un trucco
  332. ad esempio se avete una matrice di 10 righe per 2 colonne
  333. in lsl si possono rappresentare con una lista "stirata"
  334. ad esempio la lista
  335. list matrix=[ "a",5,"b",6,"c",7];
  336. potrebbe corrispondere ad una matrice di 3 righe per 2 colonne
  337. la prima riga è "a" 5
  338. la seconda "b" 6
  339. ecc
  340. questa lista viene indicata come una lista con "stride=2"
  341. stride credo che si possa tradurre come "salto" od intervallo
  342. quindi dice che "ogni due" parte una nuova riga
  343. non so se ve l'ho presentato chiaramente
  344. ok allora stop con le stride per il momento
  345. l'altro grosso concetto
  346. è rappresentato dalla trasformazione di una lista in stringa
  347. e viceversa
  348. questo è IMPORTANTISSIMO
  349. perchè spesso nelle liste vi sono informazioni importanti
  350. che devono essere trasmesse fra oggetti
  351. come vedremo
  352. e dobbiamo avere uno strumento per mandare la lista come se fosse una stringa
  353. le funzioni più semplici per fare questo sono llList2CSV (lista=>stringa)
  354. e llCSV2List (stringa lista)
  355. cosa fa llListStatistics?
  356. è una funzione molto potente
  357. data una lista con dei valori misurati
  358. consente di estrarre informazioni
  359. come la media
  360. lo scarto quadratico medio
  361. ed altre informazioni statistiche
  362. provate a farlo in cobol LOL
  363. ecco
  364. nell'ultima riga
  365. avete invece il solito trucco
  366. strano
  367. lst=(lst=[])+lst+x
  368. in particolare per le liste
  369. una lista potrebbe essere lunga 4-5000 bytes
  370. se non si facesse in quel modo si perderebbero 5000 bytes
  371. lst+=x
  372. usa 3 volte la memoria per lst
  373. mentre la sintassi che vi ho detto usa solo 2 volte lo spazio di memoria
  374. se avete script cicciuti
  375. dovete sapere fare queste cose
  376. altrimenti non vanno :)
  377. okay ora
  378. torniamo ad argomenti + terra terra
  379. sicuramente avete già usato la lllisten
  380. (con 3 elle) lol
  381. sapete che è importante scegliere un canale
  382. e sapete la differenza fra il canale 0, canali positivi e negativi
  383. allora lo zero è quello che dà più fastidio
  384. e dà anche più lag
  385. ma anche i canali positivi sono pesanti
  386. i canali negativi, essendo utilizzati solo dagli oggetti
  387. generano MENO lag
  388. ricordatevi di usare sempre la MINORE quantità possibile di llListen
  389. NOTA: gli IM viaggiano su canali propri totalmente diversi dai canali listen
  390. i canali negativi generano meno lag
  391. perchè non vengono rimbalzati su tutti i browser
  392. ma rimangono nel computer remoto
  393. => meno traffico di rete
  394. questa slide
  395. vi spiega la frustrazione
  396. che si ha a volte
  397. con le lllisten
  398. avete fatto uno splendido script
  399. ma quando gli parlate
  400. o quando fate touch e c'è il menu
  401. lui non fa nulla
  402. la soluzione è una sola (a parte essere perfettissimi e non dimenticarsi nulla)
  403. lol
  404. mettete tante scritte di debug per essere sicuri che tutto sia come deve essere
  405. la llListen venga fatta sul canale giusto
  406. eccetera.
  407. poi a volte voi stessi fate in modo che l'oggetto reagisca SOLO se siete l'owner
  408. ad esempio io ho modificato questa lavagna
  409. in modo che SOLO IO posso cliccarne i tasti
  410. poi lo vediamo in apposita lezione
  411. e siamo al timer
  412. anche questo coso
  413. sembra semplice
  414. ma ho visto fare delle cose con il timer :)
  415. comunque nel suo comportamento più semplice
  416. fa esattamente quello che sembra
  417. fa scattare l'evento dopo tot secondi
  418. come scritto viene spesso utilizzato
  419. per rimuovere un listen dopo un certo intervallo di tempo
  420. ricordatevi che finchè non fate llSetTimerEvent(0)
  421. il timer rimane attivo
  422. e continua a scattare
  423. sul touch
  424. (forse l'evento + usato su secondlife)
  425. mi sa che lo sapete usare tutti
  426. mi sapete dire che cosa rappresenta quell'integer count?
  427. c'è scritto sulla slide :)
  428. E' il numero di avatar che tocca l'oggetto...
  429. però la maggior parte dei programmatori
  430. non lo considerano
  431. e usano semplicemente llDetectedKey(0)
  432. perchè si suppone che in circostanze normali un solo avatar tocchi l'oggetto
  433. e noi faremo anche così (siamo pigri)
  434. ecco cosa si dovrebbe fare
  435. ok saltiamo le altre interazioni
  436. la llDialog
  437. è anche usatissima
  438. e come vedete quasi sempre insieme a touch-start
  439. in questa slide
  440. vedete che elenco le opzioni
  441. dentro una lista
  442. e poi la llDialog visualizza il menù in alto a destra (il classico menu blu)
  443. la llDialog ha la particolarità
  444. che l'ordine delle scelte nella lista
  445. corrisponde in modo "strano" a come le visualizza
  446. nel menù
  447. questo succede quando avete più di 3 opzioni
  448. perchè il "maledetto" engine di sl
  449. ordina le opzioni dal basso a sinistra verso destra
  450. e poi va su in verticale
  451. come se fossero coordinate X,Y
  452. e non un testo che parte dall'alto a sinistra e poi scorre verso il basso
  453. ci sono numerosi trucchi per ovviare a questo
  454. se vedete questo listato
  455. vedete che ho messo insieme un po' tutte le funzioni che vi ho descritto prima
  456. touch_start
  457. listen
  458. dialog
  459. timer
  460. è chiaro quello che fa?
  461. => fa apparire un menù dando tot tempo di risposta
  462. perfect
  463. quella era l'ultima slide
  464. vuol dire che adesso siete pronti per la prima lezione
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement