Advertisement
salahzar

20022008 Lezione Avanzata 1. Interruttore per accendere

Feb 16th, 2020
463
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.92 KB | None | 0 0
  1. Lezione avanzata 1.
  2.  
  3. * Interruttore per accendere/spegnere luci
  4. * aprire/chiudere porte
  5. * aprire/chiudere finestre
  6. * telecomandi e teleport
  7.  
  8. 1.1. Lo scopo di queste lezioni intermedie è di offrirvi le capacità di poter scriptare degli
  9. oggetti per cose che vi servono effettivamente, quindi come supporto alle vostre
  10. attività di costruzione. Ecco perchè ho riunito insieme queste cose in questo corso
  11. della durata di circa 1 ora.
  12.  
  13. 1.2. Convenzioni:
  14.  
  15. Per esigenze di pulizia formale io uso le seguenti convenzioni:
  16.  
  17. * le variabili di norma sono prefissate con il tipo (i, l, s, v, f, r) integer, list, string, vector, float, rotation), es. iPippo,fNumber...
  18. * le variabili globali (a parte il prefisso) sono tutte MAIUSCOLE, es. iTIMER...
  19. * le graffe le metto su nuova linea per chiarezza di dove iniziano e finiscono
  20. if(x==1)
  21. {
  22. <a>
  23. }
  24. else
  25. {
  26. <b>
  27. }
  28.  
  29. 1.3. Debug
  30. * uso sempre una funzione debug(string str)
  31. debug(string str)
  32. {
  33. if(iDEBUG==1) llSay(10,str);
  34. }
  35. l'uso del canale 10 è legato al fatto che non disturba gli altri in modalità debug. Per "leggere" il debug di un oggetto siffatto basta scriptare quanto segue:
  36.  
  37. * debugger (lo trovate nella box)
  38. default
  39. {
  40. state_entry()
  41. {
  42. llListen(10, "",NULL_KEY,"");
  43. }
  44. listen(integer channel,string objname,key id,string str)
  45. {
  46. llOwnerSay("DEBUG obj: "+objname+": "+str);
  47. }
  48. }
  49.  
  50. 1.4. Comunicazione
  51.  
  52. In comune queste attività hanno il fatto che gli oggetti si parlano "a distanza". Questo
  53. vuol dire che 2 o più prim possano scambiarsi informazioni attraverso dei canali di
  54. comunicazione.
  55.  
  56. Parlare vuol dire che l'oggetto A vuole mandare un messaggio M all'oggetto B, che lo "sente" e di conseguenza esegue determinate azioni, eventualmente rispondendo
  57. all'oggetto A.
  58.  
  59. Vi sono molti modi ma i più semplici sono fondamentalmente 2: parlarsi con i canali Say, oppure parlarsi con i canali linked, se gli oggetti sono linkati assieme.
  60.  
  61. 1.5. Come si fa a parlarsi con i canali Say:
  62.  
  63. Gli oggetti A e B si devono mettere d'accordo su un canale comune, possibilmente non utilizzato da altri oggetti. Il canale di solito è:
  64. 1.5.1. predefinito nei programmi
  65. 1.5.2. selezionato attraverso una notecard
  66. 1.5.3. ottenuto indirettamente dal nome dell'oggetto
  67. 1.5.4. concordato attraverso una procedura di handshake
  68.  
  69. Noi utilizzeremo inizialmente il sistema 1.5.1, vale a dire specificheremo un canale prefissato.
  70.  
  71. 1.6 Esempio di trasmissione elementare
  72. Oggetto A (Trasmittente):
  73. integer iCHANNEL=-3000; // negativo per non essere utilizzato da avatars
  74. integer iDEBUG=1; // abilita debug
  75. debug(string str)
  76. {
  77. if(iDEBUG==1) llSay(10,str);
  78. }
  79. default
  80. {
  81. state_entry()
  82. {
  83. debug("Talking to channel "+(string)iCHANNEL+" click me to make me sending a message");
  84. }
  85. touch_start(integer count)
  86. {
  87. llSay(iCHANNEL,"Here I am");
  88. }
  89. }
  90. Oggetto B (ricevente):
  91. integer iCHANNEL=-3000; // negativo per non essere utilizzato da avatars
  92. integer iDEBUG=1; // abilita debug
  93. debug(string str)
  94. {
  95. if(iDEBUG==1) llSay(10,str);
  96. }
  97. default
  98. {
  99. state_entry()
  100. {
  101. llListen(iCHANNEL,"",NULL_KEY,"");
  102. debug("Listening to channel "+(string)iCHANNEL);
  103. }
  104. listen(integer channel,string objname,key id,string str)
  105. {
  106. if(objname=="A")
  107. {
  108. llSay(0,"Receiving "+str+" from "+objname);
  109. }
  110. }
  111. }
  112.  
  113. 1.7 Finestra che cambia la sua trasparenza
  114. Ora usiamo questo sistema per fare in modo che l'oggetto B (che rappresenta una finestra possa cambiare la sua trasparenza quando riceve
  115. da A un comando opportuno. Usiamo un dialogo per controllare il livello di trasparenza.
  116.  
  117. Oggetto A (trasmittente)
  118. integer iCHANNEL=-3000;
  119. integer iDIALOG=-3001; // canale per llDialog
  120. integer iDEBUG=1;
  121. integer iLISTEN=0;
  122.  
  123. debug(string str) {}
  124. default
  125. {
  126. touch_start(integer count)
  127. {
  128. if(iLISTEN!=0) llListenRemove(iLISTEN);
  129. key avatar=llDetectedKey(0);
  130. debug("touched, presenting menu");
  131. llDialog(avatar, "Choose transparency",["0%","50%","100%"],iDIALOG);
  132. iLISTEN=llListen(iDIALOG,"",avatar,"");
  133. }
  134. listen(integer channel,string name,key id,string str)
  135. {
  136. debug("received the command "+str+" transmitting to the window");
  137. llListenRemove(iLISTEN);
  138. iLISTEN=0;
  139. llSay(iCHANNEL,str);
  140. }
  141. }
  142.  
  143. Oggetto B(finestra)
  144. integer iCHANNEL=-3000;
  145. integer iDEBUG=1;
  146. debug()....
  147. default
  148. {
  149. state_entry()
  150. {
  151. debug("Listening to channel "+(string)iCHANNEL);
  152. llListen(iCHANNEL,"",NULL_KEY,"");
  153. }
  154. listen(integer channel,string name,key id,string str)
  155. {
  156. debug("Received command: "+str);
  157. if(str=="0%") llSetAlpha(1,ALL_SIDES);
  158. if(str=="50%") llSetAlpha(0.5,ALL_SIDES);
  159. if(str=="100%") llSetAlpha(0,ALL_SIDES);
  160. }
  161. }
  162.  
  163. 1.9.A Usando il metodo MessageLinked
  164. Oggetto A (trasmittente)
  165. integer iCHANNEL=-3000; // questo è privato al linkset
  166. integer iDIALOG=-3001; // canale per llDialog
  167. integer iDEBUG=1;
  168. integer iLISTEN=0;
  169.  
  170. debug(string str) {}
  171. default
  172. {
  173. touch_start(integer count)
  174. {
  175. if(iLISTEN!=0) llListenRemove(iLISTEN);
  176. key avatar=llDetectedKey(0);
  177. debug("touched, presenting menu");
  178. llDialog(avatar, "Choose transparency",["0%","50%","100%"],iDIALOG);
  179. iLISTEN=llListen(iDIALOG,"",avatar,"");
  180. }
  181. listen(integer channel,string name,key id,string str)
  182. {
  183. debug("received the command "+str+" transmitting to the window");
  184.  
  185. llListenRemove(iLISTEN);
  186. iLISTEN=0;
  187. llMessageLinked(LINK_SET, iCHANNEL, str, "");
  188. }
  189. }
  190. 1.9.B Oggetto B(finestra)
  191. integer iCHANNEL=-3000;
  192. integer iDEBUG=1;
  193. debug()....
  194. default
  195. {
  196. state_entry()
  197. {
  198. }
  199. link_message(integer sender, integer num, string str, key id)
  200. {
  201. if(num!=iCHANNEL) return;
  202. debug("Received command: "+str);
  203. if(str=="0%") llSetAlpha(1,ALL_SIDES);
  204. if(str=="50%") llSetAlpha(0.5,ALL_SIDES);
  205. if(str=="100%") llSetAlpha(0,ALL_SIDES);
  206. }
  207. }
  208.  
  209. 1.10 Come si vede i due sistemi sono analoghi e presentano vantaggi e svantaggi:
  210.  
  211. Vantaggi dei canali Say:
  212.  
  213. * gli oggetti si possono parlare anche se "molto" distanti (96m),
  214. * sono abbastanza facili da programmare
  215.  
  216. Svantaggi dei canali Say:
  217.  
  218. * se altri oggetti usano gli stessi canali possono entrare in conflitto
  219. * producono in generale lag
  220.  
  221. 1.11. Vantaggi dei canali MessageLinked:
  222.  
  223. * sono molto veloci
  224. * sono "riservati" (non ci sono problemi di collisione)
  225.  
  226. Svantaggi dei canali MessageLinked
  227.  
  228. * agiscono solo fra oggetti molto vicini e linkati
  229. * sono un po' più difficili da programmare
  230.  
  231. 1.12. Esercizi da farsi a casa:
  232.  
  233. * interruttore che accende / spegne una luce. (si può usare llSetPrimitiveParams([PRIM_POINT_LIGHT, TRUE, <1, 1, 1>, 1.0, 10.0, 0.75] );
  234. * potete progettare uno "slider" per controllare in modo regolare la luce o l'apertura delle finestre
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement