ITET "Aldo Capitini"

Comunicazione tra prims: detonazione a distanza

Dettagli
Categoria: Applicazioni pratiche
Pubblicato: 18 Novembre 2014

Un altro piccolo esempio pratico dove programmiamo una detonazione a distanza, combinando un semplice evento listen(), un timer() e qualche comando per generare un suono o un effetto esplosione(tramite particles).

Lo schema è il seguente:

Cominciamo dal radiocomando

Costruiamo un prim che, appena toccato, manda il segnale alla nostra dinamite. Ci servirà un semplicissimo llShout (per coprire una distanza maggiore) e un canale a scelta per la comunicazione. Avremo quindi:

default
{
state_entry()
{
// llSay(0, "Hello, Avatar!");
}

       touch_start(integer total_number)
{
llShout(1200, "esplodi");
}

  }

Useremo quindi il canale 1200 per la comunicazione tra i due oggetti..

Adesso creiamo lo script per la dinamite

Costruiamo il nostro prim-dinamite. Deve ascoltare il canale 1200, e non appena ricevuto il comando, far partire un timer (supponiamo di 10 secondi)
Il nostro timer farà esplodere il prim, una volta trascorsi i 10 secondi, e dopo un qualche secondo ritorna nuovamente allo stato di partenza.

Creiamo prima di tutto il nostro listener (dichiarando un integer come variabile globale sopra il default).. che chiameremo ascoltatore:

integer ascoltatore;

 adesso gli assegnamo il listener (che ascolta chiunque e qualunque messaggio sul canale 1200) nello state_entry:

default
{
state_entry()
{
ascoltatore = llListen(1200, "", "", ""); 
}

Adesso che abbiamo "acceso" l'ascolto, possiamo definire il nostro evento listen e il messaggio da far ascoltare
Qui dentro avvieremo il timer, e rimuoveremo il listen fino ad un prossimo reset 

integer ascoltatore;

default
{

     state_entry()
{
ascoltatore = llListen(1200, "", "", ""); 
}

      listen(integer channel, string name, key id , stringmessage)
{
if(message == "esplodi")
{
                        llOwnerSay("timer attivato!");
 llListenRemove(ascoltatore);
                        llSetTimerEvent(10);

                      }
}

Adesso non resta che configurare l'evento timer e inserire dentro un paio di comandi. L'idea è quella di far sparire l'oggetto per una decina di secondi, e farlo riapparire per una nuova esplosione.

integer ascoltatore;

default
{

      state_entry()
{
ascoltatore = llListen(1200, "", "", ""); 
}

       listen(integer channel, string name, key id , stringmessage)
{
if(message == "esplodi")
{
                        llOwnerSay("timer attivato!");
 llListenRemove(ascoltatore);
                        llSetTimerEvent(10);
}
}

       timer()
{
              llTriggerSound("esplosione",1.0); //cercate un suono da inserire nel contenuto dell'oggetto
              llSetAlpha(0.0,ALL_SIDES);
llSleep(10);
llResetScript();

          }
}

Abbiamo quasi finito, dobbiamo semplicemente inserire un llSetAlpha() che fa riapparire l'oggetto una volta resettato lo script. L'evento in cui farlo è chiaramente lostate_entry, l'evento in cui lo stato default viene inizializzato.
In più potete inserire un qualunque effetto particle per rendere piu realistica la cosa. 
Nella sezione repository ne trovere diversi da poter integrare al nostro script.

integer ascoltatore;

default
{
      state_entry()
{
ascoltatore = llListen(1200, "", "", ""); 
               llSetAlpha(1.0,ALL_SIDES);
}

       listen(integer channel, string name, key id , stringmessage)
{
if(message == "esplodi")
{
                        llOwnerSay("timer attivato!");
 llListenRemove(ascoltatore);
                        llSetTimerEvent(10);
}
}

        timer()
{
              llTriggerSound("esplosione",1.0); //cercate un suono da inserire nel contenuto dell'oggetto
              llSetAlpha(0.0,ALL_SIDES);
llSleep(10);
llResetScript();

          }
}