Advertisement
salahzar

28062008 ALI - LEGGIMI - Script Base - Uso Eventi: Timer

Feb 16th, 2020
428
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.61 KB | None | 0 0
  1. Salahzar Stenvaag
  2. ALI - Accademia delle Land Italiane
  3. Script Base
  4. Uso Eventi: Timer
  5.  
  6. Prerequisiti:
  7. - sapete rezzare un oggetto
  8. - sapete costruire lo script Hello Avatar
  9. - sapete cosa sono gli eventi touch_start e state_entry
  10. - sapete editare uno script
  11.  
  12. 0. L'uso del timer è spesso essenziale negli script per fare moltissime cose:
  13. * lanciare eventi ogni x secondi
  14. * aspettare un certo ammontare di tempo prima di eseguire una operazione
  15. * creare animazioni su scritte / immagini / movimenti
  16. * dare un intervallo di tempo massimo per eseguire operazioni (timeout)
  17. * altre (...)
  18.  
  19. 1. La teoria:
  20.  
  21. Come tutti o quasi gli eventi è sempre spezzato in due: l'impostazione e la ricezione:
  22.  
  23. Impostazione:
  24. llSetTimerEvent(float numerosecondi);
  25.  
  26. evento:
  27. timer()
  28. {
  29. .....
  30. }
  31.  
  32. NOTA1. dopo numerosecondi scatta l'evento (ma attenzione, l'evento si ripete ANCHE dopo).
  33. NOTA2. se numerosecondi è zero, il timer è disabilitato
  34. NOTA3. ci può essere un solo timer anche se con qualche trucco possiamo crearcene di "virtuali"
  35. NOTA4. visto che l'evento timer() è "povero" ci si basa molto su variabili globali
  36.  
  37. Costruite un oggetto e chiamatelo con il vostro nome + il nome dell'esercizio ed inserite gli script come indicato qui sotto facendo new script e copiando ed incollando dalla notecard.
  38. Ogni volta che cambiate esercizio fate "take" dell'oggetto vecchio nel vostro inventory e rezzatene uno nuovo.
  39.  
  40. 2. Lanciare eventi ogni x secondi.
  41.  
  42. Questo script dice qualcosa ogni 10 secondi accumulando i secondi.
  43. Nota: non scatta subito ma aspetta 10 secondi prima di partire. L'output sarà:
  44. Evento scattato, sono passati 10.000000 secondi
  45. Evento scattato, sono passati 20.000000 secondi
  46. etc.
  47. Notate che questo script se toccato si "spegne" o si accende in modo da poter "controllare" il suo comportamento.
  48. Notate l'uso dei colori e della "scrittura muta" llsettext per avere una rappresentazione visiva dell'oggetto.
  49.  
  50. // ALI
  51. // Lezioni a cura di Salahzar Stenvaag
  52. // Sezione 2: Lancio eventi ogni 10 secondi
  53. // Giugno 2008
  54. float fTOTALE=0;
  55. float fINTERVALLO=5;
  56. integer iATTIVO=1;
  57. vector vROSSO=<1,0,0>;
  58. vector vGIALLO=<1,1,0>;
  59. vector vVERDE=<0,1,0>;
  60.  
  61. // per semplificare la scrittura muta
  62. info(string str)
  63. {
  64. llSetText(str,vGIALLO,1);
  65. }
  66. default
  67. {
  68. state_entry()
  69. {
  70. info("Sezione 2\nLancio eventi ogni x secondi");
  71. llSetTimerEvent(fINTERVALLO);
  72. iATTIVO=1;
  73. llSetColor(vVERDE,ALL_SIDES); // il cubo è verde
  74. }
  75. timer()
  76. {
  77. llSetColor(vGIALLO,ALL_SIDES); llSleep(0.1); // lo sleep è essenziale per vedere il giallo
  78. fTOTALE+=fINTERVALLO;
  79. info("Evento scattato, \nsono passati \n"+(string)fTOTALE+" secondi");
  80. llSetColor(vVERDE,ALL_SIDES);
  81. }
  82. touch_start(integer count)
  83. {
  84. if(iATTIVO==1)
  85. {
  86. iATTIVO=0;
  87. llSetTimerEvent(0); // toglie il timer
  88. llSetColor(vROSSO,ALL_SIDES); // verde
  89. info("Eventi disattivati"); // informa
  90. }
  91. else
  92. {
  93. iATTIVO=1;
  94. llSetTimerEvent(fINTERVALLO); // rimette il timer
  95. llSetColor(vVERDE,ALL_SIDES); // rosso = stoppato
  96. info("Eventi attivati");
  97. }
  98.  
  99. }
  100. }
  101.  
  102.  
  103.  
  104. 3. Variante che "scatta subito"
  105.  
  106. Questo è un piccolo trucco per fare sì che l'evento scatti subito e poi si disponga all'intervallo voluto:
  107.  
  108. // ALI
  109. // Lezioni a cura di Salahzar Stenvaag
  110. // Sezione 3: Lancio eventi subito ed ogni 10 secondi
  111. // Giugno 2008
  112. float fTOTALE=0;
  113. float fINTERVALLO=5;
  114. integer iATTIVO=1;
  115. vector vROSSO=<1,0,0>;
  116. vector vGIALLO=<1,1,0>;
  117. vector vVERDE=<0,1,0>;
  118.  
  119. // per semplificare la scrittura muta
  120. info(string str)
  121. {
  122. llSetText(str,vGIALLO,1);
  123. }
  124. default
  125. {
  126. state_entry()
  127. {
  128. info("Sezione 3\nLancio eventi subito");
  129.  
  130. //************************************(1)
  131. iATTIVO=0;
  132. llSetTimerEvent(0.1); // <----- SCATTA SUBITO
  133. //************************************
  134.  
  135. llSetColor(vVERDE,ALL_SIDES); // il cubo è verde
  136. }
  137. timer()
  138. {
  139. //*************************************(2)
  140. if(iATTIVO==0)
  141. {
  142. llSetTimerEvent(fINTERVALLO);
  143. iATTIVO=1;
  144. }
  145. else fTOTALE+=fINTERVALLO; // l'incremento non lo fa all'inizio
  146. //*************************************
  147. llSetColor(vGIALLO,ALL_SIDES); llSleep(0.1); // lo sleep è essenziale per vedere il giallo
  148.  
  149. info("Evento scattato, \nsono passati \n"+(string)fTOTALE+" secondi");
  150. llSetColor(vVERDE,ALL_SIDES);
  151. }
  152. touch_start(integer count)
  153. {
  154. if(iATTIVO==1)
  155. {
  156. iATTIVO=0;
  157. llSetTimerEvent(0); // toglie il timer
  158. llSetColor(vROSSO,ALL_SIDES); // verde
  159. info("Eventi disattivati"); // informa
  160. }
  161. else
  162. {
  163. //*******************************(3)
  164. llSetTimerEvent(0.1); //
  165. //*******************************
  166. info("Eventi attivati");
  167. }
  168.  
  169. }
  170. }
  171.  
  172. Le modifiche rispetto allo script precedente:
  173. (1): Nello state entry si mette attivo=0 e si mette un timer a 0.1 (scatta subito)
  174. (2): nel timer, se era precedentemente spento allora imposta il timer, stato messo attivo.
  175. L'incremento del contatore lo fa solo al secondo scatto (il primo serve solo per dare l'avvio).
  176. (3): nel touch_start sfruttiamo il fatto che il timer() adesso sa "accendersi".
  177.  
  178.  
  179. Sezione 4. Animazioni di scritte con un timer
  180.  
  181. Usiamo un contatore ed un timer per produrre degli effetti sulle scritte (es. lampeggiante).
  182.  
  183. float fALPHA=1; // trasparenza
  184. string sNOME="Frase che lampeggia";
  185. default
  186. {
  187. state_entry()
  188. {
  189. llSetText(sNOME,<1,1,0>,fALPHA);
  190. llSetTimerEvent(0.5);
  191. }
  192. timer()
  193. {
  194. if(fALPHA==0) fALPHA=1;
  195. else fALPHA=0;
  196. llSetText(sNOME,<1,1,0>,fALPHA);
  197.  
  198. }
  199.  
  200. }
  201.  
  202. La stessa cosa la potete fare sull'intero prim per avere un prim che lampeggia.
  203.  
  204. Sezione 5. Frase che cambia colore
  205.  
  206. string sNOME="Frase che cambia colore";
  207. // gli 8 colori fondamentali
  208. list lCOLORS=[ <0,0,0>,<0,0,1>,<0,1,0>,<0,1,1>,<1,0,0>,<1,0,1>,<1,1,0>,<1,1,1>];
  209. integer iCURSORE=0; // va da 0 a 7
  210.  
  211. mostra()
  212. {
  213. vector colore=(vector)llList2String(lCOLORS,iCURSORE);
  214. llSetText(sNOME,colore,1);
  215. }
  216.  
  217. default
  218. {
  219. state_entry()
  220. {
  221. iCURSORE=0;
  222. mostra();
  223. llSetTimerEvent(0.5);
  224. }
  225. timer()
  226. {
  227. iCURSORE++;
  228. if(iCURSORE>7) iCURSORE=0; // cicla sui colori
  229. mostra();
  230. }
  231.  
  232. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement