http://digilander.libero.it/Cenati

MS Agent: Merlin

home | e-mail e contatti | Introduzione al sito | Cosa e' e come imparare VbScript 

 

 

 

 

 

Come animare il personaggio Merlin

Agent è una applicazione che troviamo preinstallata su XP e su Win ME, ma è disponibile anche per NT. Si tratta di un personaggio che si può far apparire sullo schermo e che si esibisce in una serie di animazioni.

Sul pc probabilmente troverete preinstallato il personaggio Merlin (in C:\WINDOWS\msagent\chars), ma ne esistono altri scaricabili dal sito Microsoft, come il robot Robby (3,16 Mb) e il genio della lampada Genie (2,65 Mb). Oltre a questi ci sono altri personaggi creati per mezzo di un kit di sviluppo che trovate sul sito http://www.microsoft.com/msagent/devdownloads.htm#character. Se cercate in biblioteca qualche libro su XP con cd allegato, con un po' di fortuna troverete anche qualche informazione su MSAgent e magari i file degli altri personaggi. Su un PC che utilizzo con XP e il Service Pack 2 ho trovato altri tre personaggi nella cartella Windows\Srchasst\Chars: Rover (un cagnolino che in italiano si chiama Briciola), Earl (un papero surfer, in italiano tradotto con Spido) e Courtney (una signorina su un'auto antigravità, in italiano si chiama Lalla). Sono installati come assistenti per la finestra di ricerca dei files, ma sono a tutti gli effetti dei personaggi animabili tramite script come Merlino.

Nelle intenzioni di MS, Agent dovrebbe fornire una tecnologia innovativa e conversazionale per le applicazioni e le pagine web. Il file di help msagent.chm (698 kb) contiene in prefazione tutta una serie di considerazioni sociologiche sul comportamento di un Agent, sull'interazione sociale, sulla gestualità, sull'umore, sulla coerenza delle animazioni con la parte di programma che si sta eseguendo. Ad esempio, prima di far addormentare Merlino con Idle3_2, bisogna farlo sbadigliare con Idle3_1.

Molto più semplicemente, Merlin è un maghetto che può intrattenere i vostri utenti mentre uno script è in esecuzione. La particolarità di questo oggetto è che le animazioni vengono accodate ed il programma continua subito nelle sue elaborazioni. Posso quindi dire a Merlin di salutare, dire qualcosa, fare una magia, ecc. Ma dato che le animazioni impiegano qualche secondo ad essere completate, il mio programma sarà andato già molto avanti nello svolgimento dei suoi compiti.

Ci sono, per semplificare, due categorie di animazioni. La maggior parte si esauriscono da sole e tornano ad uno stato di attesa. Alcune hanno bisogno di un'istruzione apposita (.Stop) per terminare il ciclo infinito in cui entrano. Queste ultime sono utili per le fasi di elaborazione, in cui il personaggio "fa qualcosa" e dà l'impressione che anche il programma stia lavorando. Merlin, ad esempio, con l'animazione "processing" rimesta un calderone.

Ecco uno spezzone di codice che attiva Merlin e gli fa eseguire una serie di animazioni.
Dopo aver creato l'oggetto, devo indicare al programma dove troverà la descrizione del personaggio.

Ne definisco la posizione iniziale e lo faccio apparire con "Show". Alcune animazioni sono composte da più parti, come DoMagic1 e DoMagic2. Nella prima parte Merlino agita la bacchetta magica, nella seconda appare una nuvola di magia. "Announce" suona una tromba con lo stendardo, "congratulate" mostra un trofeo, "wave" saluta, ecc.
Da notare che alla fine del programma c'è un ciclo do/loop che attende la fine di tutta la serie di animazioni che sono state accodate. Infatti il messaggio "Ho già finito!" appare subito dopo l'avvio del programma, ma ci vogliono diversi secondi prima che sia esaurita la coda delle animazioni richieste.

Questo tempo può essere utilizzato per fare delle elaborazioni in modo che l'utente non ne percepisca la durata. Copia il programma riportato qui sotto in un file con estensione ".vbs" oppure scarica l'archivio zip contentente lo script.

'************************************************
' File:    Assistente.vbs
' Autore:  Giovanni Cenati 
' http://digilander.libero.it/Cenati
'************************************************
Option Explicit
Dim Agent, Merlin,n,animation
Set Agent = CreateObject("Agent.Control.2")
Agent.Connected = true
Agent.Characters.Load "merlin", _
  "c:\windows\msagent\chars\merlin.acs"
Set Merlin = Agent.Characters("merlin")
Merlin.Left = 0
Merlin.Top = 0
Merlin.Show
Merlin.MoveTo 220,240
merlin.play "domagic1"
merlin.play "domagic2"
merlin.play "confused"
merlin.play "announce"
merlin.play "congratulate"
merlin.play "wave"
merlin.play "read"
merlin.play "write"
merlin.play "search"
Merlin.Speak "Il programma è terminato"
merlin.think "Speriamo sia andato tutto bene..."
merlin.listen true
Merlin.Hide
msgbox "Ho già finito!"
Do While Merlin.Visible: WScript.Sleep 10 : Loop
Agent.connected = false
Set Merlin = Nothing
Set Agent = Nothing

Se questo vi è sembrato interessante, ecco un breve codice che mostra tutte le animazioni possibili per il personaggio scelto. Visualizza i valori della collezione AnimationNames. Copia il programma riportato qui sotto in un file con estensione ".vbs" oppure scarica l'archivio zip contentente lo script.

'************************************************
' File:    Assistente-elenco animazioni.vbs
' Autore:  Giovanni Cenati 
' http://digilander.libero.it/Cenati
'************************************************
Option Explicit
Dim Agent, Merlin,n,animation,a
Set Agent = CreateObject("Agent.Control.2")
Agent.Connected = true
Agent.Characters.Load "merlin", _
  "c:\windows\msagent\chars\merlin.acs"
Set Merlin = Agent.Characters("merlin")
For Each Animation in Merlin.AnimationNames
  a = a & animation &  vbtab
Next
msgbox a

L'elenco restituito avrà i seguenti valori:
RestPose, Blink, Idle2_2, Idle2_1, Idle1_1, Idle1_3, Idle1_2, Idle1_4, Greet, Idle3_1, GestureUp, GestureDown, GestureLeft, GestureRight, Show, Hide, Hearing_4(*), Hearing_1(*), Hearing_2(*), Hearing_3(*), Alert, Explain, Processing(*-rimescola il calderone), Thinking(*), Searching(*-legge nella sfera di cristallo), Acknowledge, Wave, DontRecognize, Uncertain, Decline, Sad, StopListening, GetAttention, GetAttentionReturn, Idle3_2(*-si addormenta), Surprised, Congratulate_2, Reading(*), Announce, Read, ReadReturn, Writing(*), Write, WriteReturn, Congratulate, Confused, Suggest, MoveRight, MoveLeft, MoveUp, MoveDown, StartListening, WriteContinued, DoMagic1, DoMagic2, LookDown, LookDownBlink, LookDownReturn, LookLeft, LookLeftBlink, LookLeftReturn, LookRight, LookRightBlink, LookRightReturn, LookUp, LookUpBlink, LookUpReturn, ReadContinued, Pleased, GetAttentionContinued, Process, Search, Think.

Alcune animazioni avrebbero bisogno di una animazione complementare per terminare il movimento in modo corretto. Nell'elenco, quelle che terminano con -return sono da chiamare per ritornare ad una situazione di attesa prima di passare ad un altro movimento. Valgono anche per i corrispondenti -blink, ad esempio bisogna usare LookDownReturn per terminare in modo naturale sia LookDown che LookDownBlink (guarda in basso e strizza l'occhio).

Ho contrassegnato con un asterisco (*) le animazioni che entrano in un ciclo infinito. Queste non terminano automaticamente dopo essere concluse, ma devono essere esplicitamente interrotte usando il metodo .Stop. Possono essere utili per intrattenere l'utente durante una corrispondente elaborazione (ad esempio Reading, Writing, Processing).

Un'ultima informazione... Alcune animazioni accendono un flag che è indagabile dal codice. Non è che ci abbia trovato tutta questa importanza, quindi vi rimando all'help per i dettagli. Segnalo che se Merlino è nel loop Hearing_n è posta a True la proprietà Hearing, mentre se sta dormendo (Merlin.Play "Idle3_2") sarà in stato Merlin.IdlingLevel3 = True. Gli altri stati si riferiscono ad azioni che si esauriscono da sole, quindi non mi sembra così importante indagare tramite il codice cosa sta facendo l'Agente in quell'istante.

Buon divertimento.

Giovanni Cenati

 
 

© Cenati Giovanni 2004/2010 - http://digilander.libero.it/Cenati - Reventlov at Katamail com

home | e-mail e contatti | Introduzione al sito | Cosa e' e come imparare VbScript