salahzar icon

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

salahzar | PRO | 02/16/20 08:26:39 AM UTC | 0 ⭐ | 883 👁️ | Never ⏰ | []
text |

6.61 KB

|

None

|

0 👍

/

0 👎

Salahzar Stenvaag
ALI - Accademia delle Land Italiane
Script Base 
Uso Eventi: Timer
 Prerequisiti:
- sapete rezzare un oggetto
- sapete costruire lo script Hello Avatar
- sapete cosa sono gli eventi touch_start e state_entry
- sapete editare uno script
 0. L'uso del timer è spesso essenziale negli script per fare moltissime cose:
* lanciare eventi ogni x secondi
* aspettare un certo ammontare di tempo prima di eseguire una operazione
* creare animazioni su scritte / immagini / movimenti
* dare un intervallo di tempo massimo per eseguire operazioni (timeout)
* altre (...)
 1. La teoria:
 Come tutti o quasi gli eventi è sempre spezzato in due: l'impostazione e la ricezione:
 Impostazione:
llSetTimerEvent(float numerosecondi);
 evento:
timer()
{
    .....
}
 NOTA1. dopo numerosecondi scatta l'evento (ma attenzione, l'evento si ripete ANCHE dopo).
NOTA2. se numerosecondi è zero, il timer è disabilitato
NOTA3. ci può essere un solo timer  anche se con qualche trucco possiamo crearcene di "virtuali"
NOTA4. visto che l'evento timer() è "povero" ci si basa molto su variabili globali
 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.
Ogni volta che cambiate esercizio fate "take" dell'oggetto vecchio nel vostro inventory e rezzatene uno nuovo.
 2. Lanciare eventi ogni x secondi.
 Questo script dice qualcosa  ogni 10 secondi accumulando i secondi.
Nota: non scatta subito ma aspetta 10 secondi prima di partire. L'output sarà:
Evento scattato, sono passati 10.000000 secondi
Evento scattato, sono passati 20.000000 secondi 
etc.
Notate che questo script se toccato si "spegne" o si accende in modo da poter "controllare" il suo comportamento.
Notate l'uso dei colori e della "scrittura muta" llsettext per avere una rappresentazione visiva dell'oggetto.
 // ALI
// Lezioni a cura di Salahzar Stenvaag
// Sezione 2: Lancio eventi ogni 10 secondi
// Giugno 2008
float fTOTALE=0;
float fINTERVALLO=5;
integer iATTIVO=1;
vector vROSSO=<1,0,0>;
vector vGIALLO=<1,1,0>;
vector vVERDE=<0,1,0>;
 // per semplificare la scrittura muta
info(string str)
{
    llSetText(str,vGIALLO,1); 
}
default
{
    state_entry()
    {
        info("Sezione 2\nLancio eventi ogni x secondi");
        llSetTimerEvent(fINTERVALLO);
        iATTIVO=1;
        llSetColor(vVERDE,ALL_SIDES); // il cubo è verde
    }
    timer()
    {
        llSetColor(vGIALLO,ALL_SIDES); llSleep(0.1); // lo sleep è essenziale per vedere il giallo
        fTOTALE+=fINTERVALLO;
        info("Evento scattato, \nsono passati \n"+(string)fTOTALE+" secondi");
        llSetColor(vVERDE,ALL_SIDES);
    }
    touch_start(integer count)
    {
        if(iATTIVO==1)  
        {
            iATTIVO=0;
            llSetTimerEvent(0); // toglie il timer
            llSetColor(vROSSO,ALL_SIDES); // verde
            info("Eventi disattivati"); // informa
        }
        else 
        {
            iATTIVO=1;
            llSetTimerEvent(fINTERVALLO); // rimette il timer
            llSetColor(vVERDE,ALL_SIDES); // rosso = stoppato
            info("Eventi attivati");
        }
     }
}
   3. Variante che "scatta subito"
 Questo è un piccolo trucco per fare sì che l'evento scatti subito e poi si disponga all'intervallo voluto:
 // ALI
// Lezioni a cura di Salahzar Stenvaag
// Sezione 3: Lancio eventi subito ed ogni 10 secondi
// Giugno 2008
float fTOTALE=0;
float fINTERVALLO=5;
integer iATTIVO=1;
vector vROSSO=<1,0,0>;
vector vGIALLO=<1,1,0>;
vector vVERDE=<0,1,0>;
 // per semplificare la scrittura muta
info(string str)
{
    llSetText(str,vGIALLO,1); 
}
default
{
    state_entry()
    {
        info("Sezione 3\nLancio eventi subito");
         //************************************(1)
        iATTIVO=0;
        llSetTimerEvent(0.1); // <----- SCATTA SUBITO
        //************************************
         llSetColor(vVERDE,ALL_SIDES); // il cubo è verde
    }
    timer()
    {
        //*************************************(2)
        if(iATTIVO==0)
        {
            llSetTimerEvent(fINTERVALLO);
            iATTIVO=1;
        }
        else fTOTALE+=fINTERVALLO; // l'incremento non lo fa all'inizio        
        //*************************************
        llSetColor(vGIALLO,ALL_SIDES); llSleep(0.1); // lo sleep è essenziale per vedere il giallo
         info("Evento scattato, \nsono passati \n"+(string)fTOTALE+" secondi");
        llSetColor(vVERDE,ALL_SIDES);
    }
    touch_start(integer count)
    {
        if(iATTIVO==1)  
        {
            iATTIVO=0;
            llSetTimerEvent(0); // toglie il timer
            llSetColor(vROSSO,ALL_SIDES); // verde
            info("Eventi disattivati"); // informa
        }
        else 
        {
            //*******************************(3)
            llSetTimerEvent(0.1); // 
            //*******************************
            info("Eventi attivati");
        }
     }
}
 Le modifiche rispetto allo script precedente:
(1): Nello state entry si mette attivo=0 e si mette un timer a 0.1 (scatta subito)
(2): nel timer, se era precedentemente spento allora imposta il timer, stato messo attivo. 
L'incremento del contatore lo fa solo al secondo scatto (il primo serve solo per dare l'avvio).
(3): nel touch_start sfruttiamo il fatto che il timer() adesso sa "accendersi".
  Sezione 4. Animazioni di scritte con un timer
 Usiamo un contatore ed un timer per produrre degli effetti sulle scritte (es. lampeggiante).
 float fALPHA=1; // trasparenza
string sNOME="Frase che lampeggia";
default
{
    state_entry()
    {
        llSetText(sNOME,<1,1,0>,fALPHA);
        llSetTimerEvent(0.5);
    }
    timer()
    {
        if(fALPHA==0) fALPHA=1;
        else fALPHA=0;
        llSetText(sNOME,<1,1,0>,fALPHA);
     }
 }
 La stessa cosa la potete fare sull'intero prim per avere un prim che lampeggia.
 Sezione 5. Frase che cambia colore
 string sNOME="Frase che cambia colore";
// gli 8 colori fondamentali
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>];
integer iCURSORE=0; // va da 0 a 7
 mostra()
{
    vector colore=(vector)llList2String(lCOLORS,iCURSORE);
    llSetText(sNOME,colore,1);
}
 default
{
    state_entry()
    {
        iCURSORE=0;
        mostra();
        llSetTimerEvent(0.5);
    }
    timer()
    {
        iCURSORE++;
        if(iCURSORE>7) iCURSORE=0; // cicla sui colori
        mostra();        
    }
 }

Comments