ITET "Aldo Capitini"

Costruire un HUD - Le basi

Dettagli
Scritto da Sergio Delacruz
Categoria: Applicazioni pratiche
Pubblicato: 24 Novembre 2014

Tantissime volte vengo contattato da creatori di abiti o accessori, che mi chiedono di creare un HUD da associare ai loro prodotti. Come si costruisce un HUD?

Per chi non lo sapesse, HUD sta per Head-up display, e consiste in una serie di informazioni o comandi che restano in sovraimpressione nel nostro schermo. Chiunque stia leggendo questo post, avrà almeno una volta usato HUD per animazioni, abiti, armi o altro ancora. 

Come si crea?

Il procedimento è semplicissimo. E' un normalissimo oggetto composto da semplicissimi prims, ovviamente programmati per lanciare o ricevere informazioni, eindossati appunto come HUD (dall'inventario, cliccando col destro , potete decidere in quale modalità indossare l'oggetto, e in quale parte dello schermo). 

L'HUD

Supponiamo di voler far cambiare texture ad un oggetto (io provo su un cubetto, ma pensate ad un vestito, ad una scarpa, un veicolo, o altro), il primo passo è quello di creare una base, e tanti pulsanti quante sono le opzioni che vogliamo fornire.

Se avete una minima conoscenza di editing in immagini (se non avete Photoshop, scaricate GIMP, è gratuito), create le texture per la base e per i nostri pulsanti. Io ho fatto queste:


Applico le texture al nostro oggetto creato inworld. Appena fatto lo prendiamo in inventario, da li click destro e indossiamolo come HUD:

 

Fatto. Adesso resta solo la parte riguardante gli script.

-L'HUD deve mandare un messaggio per ogni pulsante, e useremo un semplicissimollSay() che comunica su un canale specifico

-Il nostro oggetto deve ascoltare, e in base al messaggio, effettuare l'azione (cambiare texture nel nostro caso).

Uno script generico per un pulsante è il seguente:

integer channel = -2456;

default

state_entry()
{

        }

   touch_start(integer param)
{
          llSay(channel, "legno");
}

}

Negli altri, lascio lo stesso canale, ma cambio il messaggio (al posto di "legno", userò "metallo", o "cartone" o altro);

Il nostro oggetto

Adesso passiamo al nostro cubetto.
Il cubo dovrà ascoltare il messaggio lanciato da uno dei pulsanti del nostro nuovo HUD. Ecco perchè andremo a inserire un Listen per l'ascolto del comando inviato, con una "cascata di if ". Ogni if (SE) andrà a verificare quale messaggio arriva dall'HUD e quindi quale azione effettuare. 

integer channel = -2456; //lo stesso del pulsante

default

state_entry()
{
         llListen(channel, "", "", ""); //attiviamo il listen
}

 listen(integer channel, string name, key id, string message)
{
if(message == "legno") //"legno " è il messaggio mandato dal pulsante
llSetTexture("legno", ALL_SIDES); //legno qui è invece il nome della texture

              if(message == "metallo")
llSetTexture("metal02", ALL_SIDES);

              if(message == "cartone")
llSetTexture("paper", ALL_SIDES);

               if(message == "rubik")
llSetTexture("texture_rubik", ALL_SIDES);

        }

}

Fatto..! Abbiamo creato il nostro primo semplicissimo HUD, per cambiare la texture di un oggetto. Seguendo questo schema, potete ampliare la scelta, aumentando il numero delle opzioni.
NB: le texture, se richiamate per nome, devono essere nel contenuto dell'oggetto, come la fig. sopra. Altrimenti potete ricavare l'uuid e inserire quella come stringa al posto del nome texture.

Rimanendo sul nostro HUD, possiamo aggiungere qualche dettaglio per renderlo ancora più funzionale. Ad esempio, potremmo fare in modo che il pulsante attivo (ad esempio "rubik" ) sia colorato di verde. 
Per fare questo, aggiungiamo una funzione di llMessageLinked(). Questo comando permette la comunicazione, come un listen, ma tra prim dello stesso "link set", vale a dire linkati tra loro in un unico oggetto(proprio come nel nostro caso)

Quando clicchiamo un pulsante, esso al tocco si colorerà di verde, e darà un messaggio di "off " a tutti gli altri pulsanti, che resteranno di colore neutro.In più ascolterà gli altri pulsanti, in attesa di un eventuale messaggio di "off" che lo renda di colore neutro.
Lo script seguente va applicato ad ogni pulsante(variando ovviamente il nome del messaggio da comunicare al cubo): 

integer channel = -2456;

default

   state_entry()
{

        }

   touch_start(integer param)
{
          llSay(channel, "legno");
          llMessageLinked(LINK_ALL_OTHERS,0,"off","");//comunica a tutti gli altri pulsanti di andare "off"
          llSetColor(<0,1,0>,ALL_SIDES); //diventa verde
}

   link_message(integer source, integer num, string msg, keyid)
{
if(msg == "off") //ascolta dagli altri pulsanti: se off, allora diventa neutro
{
               llSetColor(<1,1,1>,ALL_SIDES); 
}
}

}

Ecco il risultato, se clicco un pulsante:

Abbiamo visto in maniera molto semplificata cosa è un HUD e le basi per crearlo. Nei post successivi vedremo come integrare funzioni più avanzate, ad esempio avviare un animazione.