Scriptiamo una “Guida Turistica” (Pergola) Salahzar Stenvaag ALI – Accademia Land Italiane Ottobre 2009
Introduzione Pilotato
da una notecard Oggetto fisico “personale” su cui ci si può “sedere” Sulla notecard coordinate, titolo, descrizione Sequenza di frasi da dire mentre ci si muove Specifica della rotazione finale Si muove verso prossima tappa con un “touch” All’ultimo touch torna alla posizione pagina
2
Struttura Notecard # Posizione iniziale, testo, colore,rotazione <48,29,251>|Sono la guida, cliccami|<1,0,0>|<0,0,0> # Le righe successive contengono la prima posizione finale, titolo, colore, rotazione,secondi per arrivarci # poi una serie di righe che terminano con una riga vuota e così via <54,35,251>|La Torre|<0,0,1>|<0,0,45>|3 Adesso andiamo alla torre seguimi per cortesia arriveremo subito
# Ultima destinazione termina invece con FINE <54,29,251>|Destinazione finale|<0,1,0>|<0,0,90>|5 Andiamo alla destinazione finale FINE
pagina
3
Struttura del programma Variabili
globali (essenziali!!!!) Funzioni di utilità (parse) Stato default per copiare la notecard in memoria ◦ State_entry: inizio lettura notecard ◦ Dataserver: per leggere via via le varie righe Stato
ready (pronta per fare la guida) ◦ State_entry: inizializza prima “stazione” pagina ◦ Touch_start: per passare prossima
4
Variabili globali string notecard; // nome della notecard integer line; // riga a cui siamo arrivati a leggere list lines; // copia della notecard senza # commenti
vector pos; // posizione letta “stazione” string text; // Titolo “stazione” per llSetText vector color; // colore del titolo vector rot; // rotazione dell’avatar float secondi; // quanti secondi pagina
5
Funzione “parse” per estrarre elementi riga (pos,text,col,rot,secs) parse(string s)
{ list pieces=llParseStringKeepNulls(s, ["|"],[]);
pos=(vector)llList2String(pieces,0) ; text=llList2String(pieces,1);
pagina
6
Stato default state_entry default { state_entry() { llSetStatus(STATUS_PHYSICS,FALSE); llSetBuoyancy(1); // fluttua in aria llSetText("Sono una guida turistica",<1,1,1>,1);
notecard=llGetInventoryName(INVENTO RY_NOTECARD,0); pagina 7 lines=[];
Stato default data_server dataserver(key id,string str) {
llSetText("Reading line "+ (string)line,<1,1,1>,1); if(str!=EOF) { // ignora le righe che iniziano con # if(llGetSubString(str,0,0)!="#") lines+=[str]; line++; llGetNotecardLine(notecard,line); pagina
8
Stato ready state_entry state ready { state_entry() { line=0; // trova pos, text, color parse(llList2String(lines,line)); llSetText(text,color,1); llSetPos(pos); llSetRot(llEuler2Rot(DEG_TO_RAD*rot));
pagina
9
Stato ready touch_start touch_start(integer total_number) { line++; if(text=="FINE“) { llResetScript(); return; } parse(llList2String(lines,line)); llSetText(text,color,1); id=llTarget(pos,.3); llSetStatus(STATUS_PHYSICS,TRUE); llMoveToTarget(pos,secondi); while(TRUE) { line++; text=llList2String(lines,line); if(text=="FINE") return; if(text=="") return; pagina
10
Stato ready at_target
at_target(integer tnum, vector pos, vector our) { llTargetRemove(id);
llSetStatus(STATUS_PHYSICS,FALSE); llSetPos(pos);
llSetRot(llEuler2Rot(DEG_TO_RAD*rot )); llSay(0,"cliccami per la prossima pagina
11