Giorno 26 Maggio si è tenuta la seconda lezione di LSL sempre alla Land del Forum. Oggetto della lezione, questa volta, la Comunicazione degli oggetti.
Abbiamo tre tipi fondamentali di comunicazione nel linguaggio LSL:
- Comunicazione all’interno dell’oggetto, ovvero tra i prim che compongono l’oggetto;
- Comunicazione tra un oggetto ed un altro oggetto o un Agent;
- Comunicazione tra un oggetto e l’esterno.
Nella lezione ci siamo soffermati sulla comunicazione tra un oggetto e l’agent, ma abbiamo già predisposto l’oggetto per effettuare una comunicazione interna tra i prim che lo compongono. Abbiamo, infatti, creato un oggetto formato da due prim: un cubo come root e una piramide come child. Una primissima osservazione che abbiamo fatto è stata quella di notare la seguente differenza:
Uno script inserito nel prim root di un oggetto ha effetto su tutto l’oggetto, mentre uno script inserito in un prim child ha effetto esclusivamente su quel child.
Abbiamo notato questa differenza semplicemente inserendo lo script di default (quello che viene creato in automatico quando si crea un nuovo script) prima sul prim child e poi su quello root.
Ebbene, se inserito solo nel child ottenevamo la scritta “Touched.” esclusivamente se toccavamo il prim piramide dell’oggetto non nel cubo, mentre se inserito nel root ottenevamo la scritta “Touched.” sia se toccavamo la piramide sia se toccavamo il cubo.
Notata questa differenza, ci siamo inoltrati nello studio della Comunicazione tra oggetto ed Agent. Ci siamo quindi dedicati allo studio della funzione
integer llListen(integer canale, string nome, key id, string messaggio)
e del suo evento associato
listen(integer canale, string nome, key id, string messaggio)
I parametri di ingresso, come potete notare da soli, sono del tutto simili ed infatti assumono lo stesso significato:
Canale – Indica il canale di comunicazione. Vi ricordo che il canale pubblico ha valore 0 ed è identificato dalla costante PUBLIC_CHANNEL. Tutti gli altri canali, in un range compreso tra -2.147.483.648 a 2.147.483.647, sono i canali privati. Comunemente bisognerebbe utilizzare i canali negativi per interazioni tra oggetti e quelli positivi per interazioni con agent;
Nome – Indica il filtro di ascolto su un determinato nome;
Id – Indica il filtro di ascolto su una determinata key;
Messaggio – Indica il filtro su un determinato messaggio.
Il nostro intento è stato quello di creare uno script in ascolto su un canale privato della parola “Ciao” detta dall’owner, al quale l’oggetto doveva rispondere con messaggio “Ciao a te!” diretto esclusivamente
all’owner.
Abbiamo dovuto applicare i seguenti filtri alla funzione llListen:
Canale = 1
Nome = “”
Key = llGetOwner()
Messaggio = “Ciao”
Ovvero, abbiamo usato il canale 1, non abbiamo specificato il nome ma la key dell’owner dell’oggetto (recuperata in automatico grazie alla funzione llGetOwner()), ed abbiamo aggiunto il filtro “Ciao” al messaggio.
Tradotto in LSL, il comando da eseguire per impostare un ascoltatore è il seguente:
integer handler = llListen(1, "", llGetOwner(), "Ciao")
questo comando restituisce un handler dell’ascoltatore. Questo può essere usato per disattivare l’ascoltatore in un altro punto del codice. In questo nostro semplice script, abbiamo ignorato l’handler.
Una volta che abbiamo impostato il nostro ascoltatore, non ci resta che rispondere “Ciao a te!” quando viene sollevato l’evento ed il gioco è fatto!
Questo è lo script risultante:
default {
state_entry() {
llListen(1, "", llGetOwner(), "Ciao");
}
listen(integer canale, string nome, key id, string messaggio) {
llOwnerSay("Ciao a te!");
}
}
Per poterlo provare ci basta scrivere:
/1 Ciao
(vi ricordo che il “/1” iniziale significa “ridirigi questa stringa sul canale 1”. Infatti, questa comunicazione non viene letto in modo diretto da nessun agent, non essendo fatta nel canale pubblico).
Ricordatevi che c’è differenza tra “Ciao”, “CIAO” e “ciao”… il nostro script funziona solo con la prima stringa visto che il linguaggio LSL è case-sensitive!
Se tutto va bene il nostro oggetto ci risponderà con “Ciao a te!” e noi abbiamo completato con successo la nostra comunicazione tra Agent e Oggetto!
Alla prossima lezione!