ITET "Aldo Capitini"

Come creare lanterne cinesi

Dettagli
Categoria: Applicazioni pratiche
Pubblicato: 25 Agosto 2015

Avete mai pensato di creare un set di lanterne magiche per la vostra land? In realtà è più semplice di quanto sembri, dal momento che tutto quello che ci servirà sarà uno script di poche righe ( e una lanterna, ovviamente!). Lo script, che permetterà al tocco di far "decollare" una lanterna, è applicabile a tantissimi altri oggetti ( ad esempio dei palloncini, dei nastri etc). 

Sarò rapido sulla parte riguardante la costruzione: io ad esempio ho fatto una semplicissima lanterna con blender, in modo da modellarla e renderla meno "poligonale". Per facilità qui useremo due semplici cilindri (corpo base e "coperchio"), e un torus ( che fa da anello). Assicuratevi che il root prim sia il corpo centrale (per facilitare la posizione iniziale della lanterna e dello script). Infine sbizzarritevi usando una texture, un colore acceso e un pò di lucentezza!

image.jpg

Creata la vostra lanterna, conservatene una copia per sicurezza nell'inventario. Vediamo di creare uno script che ne permetta il volo.

Lo script, non appena inizializzato, avrà ovviamente delle condizioni basilari: stato fisico spento(false), timer spento, stato phantom acceso(true). 
In questo modo la lanterna sarà ferma, senza fare strani scherzi fisici, e phantom (vale a dire fantasma, attraversabile)

state_entry()

 llSetStatus(STATUS_PHANTOM, TRUE); 
 llSetStatus(STATUS_PHYSICS,FALSE); 
 llSetTimerEvent(0); 
}

Al tocco, imposto inizialmente una "destinazione". Questa destinazione, che si manterrà per tutto il percorso, sarà casuale tra i valori 8 e - 8 (llFrand) per gli assi X e Y,(cosi facendo ogni lanterna volerà su una diagonale diversa) e fissa per Z(l'asse verticale). Permetterò anche una leggera rotazione della lanterna su se stessa, in modo da simulare un effetto più realistico (tramite llTargetOmega)
Nel momento in cui l'oggetto viene toccato, avvio un timer con frequenza di 0.2 decimi di secondo.

touch_start(integer total_number)

direzione = <llFrand(16)-8,llFrand(16)-8,10>; 
   llTargetOmega(<0,0,1>,PI/18,1); 
   llSetTimerEvent(0.2); 
}

L'evento timer contiene la funzione principale che permette il volo, llMoveToTarget, che legge ogni 0.2 l'attuale posizione e ne aggiunge quella stabilita in precedenza. Così la lanterna sarà obbligata ad andare sempre piu in alto!
Sempre nel comando llMoveToTarget, il valore 10 è la velocità con cui viene eseguito il movimento. Più il valore è piccolo, più il movimento sarà veloce, perchè impiegherà meno secondi per raggiungere il vettore "direzione". 
In più ho stabilito la durata della "vita" di una lanterna. Ho creato un contatore (durata) che all'interno del timer incrementa di 1 (ogni 0.2 decimi). Essendo il timer di 0.2, in un 1 secondo la durata raggiungerà il valore di 5. 
La lanterna con una durata di 100 unità, avrà una vita di 20 secondi (0.2 x 100). Dunque ho scritto: se la durata è maggiore o uguale a 100, cancella la lanterna.
Potete incrementare a vostro piacere. La funzione llDie è necessaria, per evitare lanterne a oltre 4000 metri di altezza o inceppate da qualche parte!

timer() 
{
 llSetStatus(STATUS_PHYSICS, TRUE); 
 llMoveToTarget(llGetPos()+direzione,10);
durata ++;
if(durata >= 100)
llDie();
}

Adesso vediamo lo script per intero, incluse le variabili globali, direzione e durata, che devo ovviamente dichiarare all'inizio

vector direzione;
integer durata;

default
{
on_rez(integer param)
{
llResetScript(); 
}

state_entry()

llSetStatus(STATUS_PHANTOM, TRUE); 
llSetStatus(STATUS_PHYSICS,FALSE); 
llSetTimerEvent(0); 
}

touch_start(integer total_number)

direzione = <llFrand(16)-8,llFrand(16)-8,10>; 
llTargetOmega(<0,0,1>,PI/18,1); 
llSetTimerEvent(0.2); 
}

timer() 
{
llSetStatus(STATUS_PHYSICS, TRUE); 
llMoveToTarget(llGetPos()+direzione,10);
durata ++;
if(durata >= 100)
llDie();
}

}

Ecco qui. Ricordo inoltre che questo script permette un uso "singolo". Dopo 20 secondi la lanterna si autoelimina, quindi tenete sempre a disposizione una copia sul vostro inventario.
Nel prossimo tutorial, creeremo un piccolo "rezzer", (praticamente un generatore di lanterne) , in modo da poterne rezzare infinite per la vostra land.

In questo video ecco quelle create da me, con il medesimo script ma con una partenza "automatica":