UTILIZZO DI WIIMOTE E BALANCE BOARD COME STRUMENTO PER LA RIABILITAZIONE IN APPLICAZIONI REALIZZATE CON IL FRAMEWORK XNA - DISTA

Pagina creata da Asia Colombo
 
CONTINUA A LEGGERE
UTILIZZO DI WIIMOTE E BALANCE BOARD COME STRUMENTO PER LA RIABILITAZIONE IN APPLICAZIONI REALIZZATE CON IL FRAMEWORK XNA - DISTA
POLITECNICO DI MILANO
                         FACOLTÀ DI INGEGNERIA
               CORSO DI LAUREA IN INGEGNERIA INFORMATICA

      UTILIZZO DI WIIMOTE E BALANCE BOARD
     COME STRUMENTO PER LA RIABILITAZIONE
IN APPLICAZIONI REALIZZATE CON IL FRAMEWORK XNA

    Relatore: Prof. Alessandro CAMPI
    Correlatore: Ing. Paola SPOLETINI

                                               Tesi di Laurea di:
                                               Enrico BONTEMPI
                                               Matricola n. 704443
                                               Roberto CARETTONI
                                               Matricola n. 704099

                    ANNO ACCADEMICO 2009-2010

                                                                     1
UTILIZZO DI WIIMOTE E BALANCE BOARD COME STRUMENTO PER LA RIABILITAZIONE IN APPLICAZIONI REALIZZATE CON IL FRAMEWORK XNA - DISTA
Indice
Indice .................................................................................................................................2
Capitolo 1.          Introduzione.................................................................................................5
Capitolo 2.          L’innovazione di Nintendo Wii ....................................................................6
Capitolo 3.          Il Wiimote [4] ..............................................................................................7
   3.1       Pulsanti ................................................................................................................8
   3.2       Accelerometro .....................................................................................................9
       3.2.1        Accelerazione statica e dinamica ...................................................................9
       3.2.2        Interpretazione dei valori rilevati ................................................................10
       3.2.3        Calcolo delle inclinazioni degli assi ............................................................10
   3.3       Puntamento Infrarosso .......................................................................................12
       3.3.1        Sensor Bar ..................................................................................................12
       3.3.2        Tecnica di puntamento ................................................................................13
       3.3.3        Posizione di puntamento .............................................................................13
       3.3.4        Levigatura del cursore.................................................................................14
   3.4       Altre funzionalità ...............................................................................................15
       3.4.1        LED ............................................................................................................15
       3.4.2        Rumble .......................................................................................................15
       3.4.3        Speaker .......................................................................................................15
   3.5       Estensioni ..........................................................................................................16
       3.5.1        Nunchuk .....................................................................................................16
       3.5.2        Classic Controller .......................................................................................17
       3.5.3        Wii Motion Plus ..........................................................................................17
       3.5.4        Wii Balance Board ......................................................................................18
Capitolo 4.          Interfacciamento e connessione dei dispositivi ...........................................19
   4.1       HID [5] ..............................................................................................................19
       4.1.1        L’innovazione di HID .................................................................................19
       4.1.2        Il protocollo HID ........................................................................................20
       4.1.3        Bluetooth HID ............................................................................................20
   4.2       Bluetooth [6]......................................................................................................21

                                                                                                                                       2
UTILIZZO DI WIIMOTE E BALANCE BOARD COME STRUMENTO PER LA RIABILITAZIONE IN APPLICAZIONI REALIZZATE CON IL FRAMEWORK XNA - DISTA
4.2.1      BlueSoleil [7] .............................................................................................21
    4.2.2      Connessione del Wiimote ...........................................................................22
  4.3    Wiimotelib .........................................................................................................24
    4.3.1      Creazione del canale di comunicazione .......................................................24
    4.3.2      Trasmissione dei pacchetti ..........................................................................26
Capitolo 5.    Ambiente di Sviluppo .................................................................................28
  5.1    Microsoft Visual Studio 2008 [12] .....................................................................28
  5.2    C# [13] ..............................................................................................................28
  5.3    Il Framework XNA [15].....................................................................................29
  5.4    Struttura di un progetto XNA [16]......................................................................29
    5.4.1      Metodi predefiniti .......................................................................................30
    5.4.2      Componenti ................................................................................................30
    5.4.3      Grafica 2D ..................................................................................................31
  5.5    Audio .................................................................................................................32
    5.5.1      XACT .........................................................................................................32
    5.5.2      Classe statica Audio ....................................................................................32
  5.6    Requisiti di piattaforma ......................................................................................34
Capitolo 6.    Ideazione del software ................................................................................35
  6.1    Specifiche del software ......................................................................................35
    6.1.1      Design della batteria ...................................................................................35
    6.1.2      Criteri di movimento ...................................................................................36
    6.1.3      Composizione e disegno della batteria ........................................................39
    6.1.4      Determinazione e controllo della posizione del centro di massa ..................40
    6.1.5      Fase di gioco ...............................................................................................41
    6.1.6      Modalità Free .............................................................................................42
Capitolo 7.    Gestione del Wiimote con Wiimotelib ........................................................43
  7.1    La classe Wiimote..............................................................................................43
    7.1.1      Metodi ........................................................................................................44
    7.1.2      Eventi .........................................................................................................44
    7.1.3      WiimoteCollection ......................................................................................44
  7.2    Le strutture dati..................................................................................................45
  7.3    Eccezioni ...........................................................................................................47

                                                                                                                                3
UTILIZZO DI WIIMOTE E BALANCE BOARD COME STRUMENTO PER LA RIABILITAZIONE IN APPLICAZIONI REALIZZATE CON IL FRAMEWORK XNA - DISTA
7.4       Implementazione della classe WiiMote ..............................................................47
       7.4.1       Metodi della classe WiiMote.......................................................................48
Capitolo 8.         Implementazione del videogame ................................................................49
   8.1       La classe DrumAble ...........................................................................................50
       8.1.1       Modalità di esecuzione ...............................................................................51
       8.1.2       Compiti della classe DrumAble...................................................................51
   8.2       I componenti della sezione menu .......................................................................52
       8.2.1       La classe Menu ...........................................................................................52
       8.2.2       La classe Istruzioni .....................................................................................52
       8.2.3       La classe Tracklist ......................................................................................52
       8.2.4       La classe Speed...........................................................................................53
       8.2.5       La classe RiproduzioneSequenza ................................................................53
   8.3       Le tracce predefinite ..........................................................................................53
       8.3.1       La classe Traccia ........................................................................................53
       8.3.2       I DataSet .....................................................................................................54
   8.4       L’input della fase di gioco ..................................................................................54
       8.4.1       La classe Percussione ..................................................................................54
       8.4.2       Rilevamento dei gesti..................................................................................55
       8.4.3       Evento PercussioneChanged .......................................................................55
       8.4.4       La classe BalanceBoard ..............................................................................55
   8.5       I componenti della fase di gioco .........................................................................56
       8.5.1       La classe PlayScreen ...................................................................................56
       8.5.2       La classe Logica .........................................................................................57
Capitolo 9.        Sviluppi futuri.............................................................................................58
Elenco figure ...................................................................................................................59
Elenco Tabelle .................................................................................................................59
Bibliografia ......................................................................................................................60

                                                                                                                                   4
UTILIZZO DI WIIMOTE E BALANCE BOARD COME STRUMENTO PER LA RIABILITAZIONE IN APPLICAZIONI REALIZZATE CON IL FRAMEWORK XNA - DISTA
Capitolo 1.                           Introduzione
Nel 2006 Nintendo lancia la console Wii [1], appartenente alla settima generazione [2], la
cui innovazione è insita nella nuova natura dei controller, che non sono più dei semplici
telecomandi che permettono di comandare i giochi soltanto premendo dei pulsanti, ma
dispositivi in grado di rilevare il movimento del corpo o di alcune sue parti rendendo così
possibile un’associazione tra gesti compiuti dai giocatori e azioni di risposta all’interno dei
videogame.
Questo lavoro si colloca in un più ampio progetto di sviluppo di applicazioni rivolte a
soggetti con disabilità motorie [3], quali individui paraplegici. Tale progetto consiste nella
creazione di videogiochi con finalità terapeutiche, con l’intento cioè di intrattenere gli
utenti stimolandoli a compiere determinati movimenti, introducendo così l’uso di questi
software ad esempio nella riabilitazione post-trauma. Grazie alle loro caratteristiche, i
controller di Wii si prestano particolarmente a questo ambito di progetto, e sono l’ideale
strumento di interazione con l’utente in applicazioni di questo genere.
L’obiettivo di questo lavoro è sfruttare la tecnologia del Wiimote e della Balance Board
mediante la creazione di interessanti applicazioni indipendenti dai pulsanti e governabili il
più possibile attraverso i movimenti di un Wiimote e il rilevamento del baricentro tramite
la Balance Board. Il prodotto di questo lavoro è un software che simula una batteria
musicale, utilizzabile mediante il compimento di diversi gesti con il Wiimote, stando seduti
sulla Balance Board.
Questo progetto permette di estendere l’ambito dei lavori svolti in passato, che si
concentravano principalmente sull’equilibrio e sul movimento del busto mediante l’uso
esclusivo della Balance Board, all’utilizzo degli arti superiori.

                                                                                             5
UTILIZZO DI WIIMOTE E BALANCE BOARD COME STRUMENTO PER LA RIABILITAZIONE IN APPLICAZIONI REALIZZATE CON IL FRAMEWORK XNA - DISTA
Capitolo 2. L’innovazione                                                             di
Nintendo Wii
Le innovazioni introdotte con Nintendo Wii [1] aprono varie frontiere nel videogaming in
quanto l’utilizzo di movimenti come input per i giochi permette di modellare in maniera
molto più naturale le interazioni con l’utente. Diventa così possibile simulare i gesti
compiuti in discipline sportive, nell’uso di strumenti musicali o di utensili attraverso i
telecomandi di Wii, e introdurre tutte queste attività in svariati videogame che riscuotono
notevole successo.
Il controller principale della console Wii è il Wiimote; è un telecomando senza fili che
comunica con la console attraverso la tecnologia Bluetooth. Il Wiimote è dotato di
pulsanti, di un accelerometro in grado di rilevare i movimenti impressi al telecomando, e di
altri dispositivi che consentono l’interazione sia per l’input che per l’output.
Al Wiimote possono essere collegati mediante un apposito connettore altri controller tra
cui: Nunchuk, Classic Controller, WiiMotionPlus, chitarra e batteria di Guitar Hero e altri.
Questi dispositivi vengono identificati dalla console come estensioni del controller
principale, e il flusso di informazioni trasmesse relativo ad un’estensione viene inglobato
nelle informazioni del Wiimote. È possibile collegare una sola estensione al Wiimote, a
meno che si tratti del WiiMotionPlus, che dispone di un connettore per estensioni, agendo
così in modo “trasparente” e permettendo l’inserimento di una seconda estensione.
Un altro controller di Wii è la Wii Balance Board; è una pedana che comunica via
Bluetooth con la console attraverso lo stesso protocollo utilizzato dal Wiimote, ma che
differisce da quest’ultimo come tecnologia interna in quanto è composta da quattro bilance
che rilevano lo spostamento del peso dell’utente che si posiziona sopra di essa.

                                                                                          6
UTILIZZO DI WIIMOTE E BALANCE BOARD COME STRUMENTO PER LA RIABILITAZIONE IN APPLICAZIONI REALIZZATE CON IL FRAMEWORK XNA - DISTA
Capitolo 3.                           Il Wiimote [4]
Il controller di Nintendo Wii utilizza un approccio di interazione differente da quello
tradizionale, nel tentativo di risultare interessante per un pubblico più vasto. Il Wiimote ha
la forma di un comune telecomando da televisione e viene tenuto in una sola mano;
Essendo simmetrico, appare ugualmente utilizzabile da destrorsi e mancini.
Il componente principale del Wiimote è il chip Broadcom; esso è dotato di alcuni registri e
di un microcontrollore, attraverso cui gestisce il flusso interno dei dati (input e output dalle
periferiche interne) e le trasmissioni con la console. Il chip fa da riferimento per gli altri
componenti interni al dispositivo, in quanto la struttura del Wiimote è progettata intorno ad
esso.
Vi sono due funzionalità di input direttamente controllate dal chip: un accelerometro a tre
assi e 11 pulsanti (più il pulsante Power). In aggiunta, il telecomando, contiene un
ricevitore infrarosso con un processore di monitoraggio oggetti, una porta d’espansione che
permette di collegarvi fonti di input addizionali (le estensioni), uno speaker e un “rumble
pack” che consente al telecomando di vibrare.

                                       Figura 1: Wiimote

                                                                                              7
3.1 Pulsanti
Il Wiimote ha 11 pulsanti sul lato frontale e uno sul retro; tra questi, il pulsante Power è
speciale ed è considerato differentemente dagli altri dal dispositivo. Tutti gli altri pulsanti
sono indipendentemente accessibili attraverso un pacchetto di 2 byte che viene trasmesso
per primo nella maggior parte dei report. Il bit corrispondente ad un pulsante assumerà
valore 1 se il pulsante è premuto oppure 0 in caso contrario. Di norma questi pacchetti
vengono inviati quando lo stato di qualche pulsante cambia, ma è anche possibile
configurare il Wiimote affinché invii lo stato dei pulsanti continuamente attraverso
un’alterazione del Data Reporting Mode.
I pulsanti dei Wiimote sono i seguenti: A, B (retro), un Pad direzionale, +, -, Home, 1 e 2.
Quando il Wiimote è spento, la pressione del pulsante Power provoca un tentativo di
riattivazione della comunicazione con la Wii a cui è sincronizzato. I dettagli
implementativi che portano all’accensione non sono stati resi pubblici e sono contenuti nel
modulo Bluetooth di Wii. La connessione del telecomando con un diverso host (pc) non
può invece avvenire automaticamente ma occorre ripetere il procedimento di connessione
dal software Bluetooth dell’host. Se il Wiimote è acceso e connesso a un host, la pressione
e il mantenimento del pulsante Power per qualche secondo fa sì che il telecomando
richieda una disconnessione dall’host e si spenga.
Vi è inoltre un ulteriore pulsante nascosto nel vano batterie: il Sync Button. Alla pressione
di tale tasto il Wiimote si disconnette dall’host con il quale ha una connessione attiva e si
pone in modalità di rilevazione accettando richieste di connessione o accoppiamento per
esattamente 20 secondi.

                                                                                             8
3.2 Accelerometro
Il Wiimote contiene un accelerometro lineare a tre assi posto sulla faccia superiore della
base del circuito interno, leggermente a sinistra del pulsante A. Si tratta di un componente
integrato semplicemente saldato al circuito: l’ADXL330               di Analog Devices. Questo
dispositivo può misurare l’accelerazione di gravità statica per applicazioni che
percepiscono l’inclinazione, così come l’accelerazione dinamica derivante da movimenti,
scosse o vibrazioni.
La misurazione avviene con valore minimo di fondo scala di ±3g e una sensibilità del 10%.

3.2.1           Accelerazione statica e dinamica
Poiché il funzionamento reale dell’accelerometro consiste nella misura della forza
esercitata da un insieme di piccole masse di resistenza poste al suo interno nei confronti del
guscio che le contiene, esso misura un’accelerazione lineare di un punto di riferimento in
caduta libera: questo significa che se il Wiimote fosse in caduta libera, riporterebbe
accelerazione    zero.   Quand’è     immobile      invece,    rileva     un’accelerazione   pari
all’accelerazione di gravità g (ma nella direzione opposta, verso l’alto, +Z quando è fermo
in posizione orizzontale). Questo dato può essere usato per intuire l’inclinazione del
telecomando dagli output di accelerazione quando il Wiimote è ragionevolmente fermo.

                              Figura 2: Wiimote e assi direzionali

                                                                                              9
3.2.2          Interpretazione dei valori rilevati
La Figura 2 rappresenta il Wiimote e gli assi di riferimento dell’accelerometro:
l’orientamento degli assi permette di interpretare il valore letto per ognuno di essi e
dedurne l’inclinazione rispetto alla posizione piana (orizzontale) oppure la direzione del
movimento dell’accelerazione rilevata. Durante la fase sperimentale di studio del Wiimote
si è notato che non tutti i movimenti vengono rilevati, ma il valore relativo ad un asse varia
soltanto se tale asse si muove ruotando in un piano, necessariamente ortogonale al suolo,
che lo contiene. Ad esempio il movimento rotatorio del polso, mantenendo il telecomando
in posizione orizzontale, può essere modellizzato come la rotazione del piano XZ intorno
all’asse Y che funge da perno; tale movimento può essere rilevato dalle variazioni dei
valori dei tre assi, riconoscendo una variazione positiva o negativa dei valori di X e Z (a
seconda che la rotazione sia avvenuta in senso orario o antiorario) e una conservazione del
valore precedente di Y.
Al contrario, un movimento rotatorio del telecomando appoggiato su un piano (rotazione
del piano XY con perno l’asse Z) non può essere rilevato in quanto l’asse Z funziona da
perno e quindi non subisce scostamenti, e nonostante gli assi X e Y stiano effettivamente
ruotando, non ne viene riscontrata una variazione dei valori in quanto il piano da essi
costituito è parallelo al suolo e non ortogonale, quindi anche ripetendo o velocizzando il
movimento l’accelerometro non rileverebbe variazioni: come se il telecomando fosse
fermo.

3.2.3          Calcolo delle inclinazioni degli assi
Come conclusione allo studio del funzionamento dell’accelerometro nell’ambito
dell’accelerazione statica, si è cercata una formula che permettesse di tradurre i valori letti
dal dispositivo nelle rispettive inclinazioni degli assi corrispondenti, interpretate come
sfasamenti da una posizione base, e cioè un angolo di 0° equivalente a una posizione
orizzontale, parallela al suolo, dell’asse.
A seconda dell’inclinazione dell’asse, il valore letto dal telecomando assume valori
compresi tra +1 e -1. Definito l’orientamento degli assi come mostrato in Figura 2, si è

                                                                                            10
messo in relazione il valore letto con la posizione dell’asse, raggiungendo le conclusioni
seguenti:
   • Se l’asse (X, Y, Z) si trova in posizione orizzontale, e cioè ortogonale alla direzione
       della forza di gravità, il valore rilevato è 0
   • Se l’asse si trova nella stessa direzione della forza di gravità e con verso concorde
       (verso il basso), il valore rilevato è -1
   • Se l’asse si trova nella stessa direzione della forza di gravità ma con verso discorde
       (verso l’alto), il valore rilevato è +1

Ponendo a questo punto gli angoli corrispondenti alle posizioni limite (aventi la direzione
della forza di gravità con verso concorde o discorde) rispettivamente -90° e +90°, si può
scrivere la seguente equazione che mette in relazione angoli e valori (fissati da un’ipotesi
teorica) di due posizioni limite:
                       (Y90° - Yα) : (Y90° - Y0°) = (90° - α) : (90° - 0°)
È un’interpolazione lineare dove:
   • Y90° indica il valore di Y letto quando l’asse Y si trova a +90° (Y90° = -1)
    • Yα indica il valore di Y letto quando l’asse Y si trova all’angolo α
   • Y0° indica il valore di Y letto quando l’asse Y si trova a 0° (Y90° = 0)
   • α è l’angolo corrispondente al valore dell’asse Y letto (Yα)
Da questa interpolazione si può ricavare la formula finale:
                                         α = -90° · Yα
Che permette effettivamente di identificare in modo univoco l’angolo (di sfasamento)
corrispondente al valore dell’asse letto.

In Figura 2 sono indicati anche tre movimenti che in realtà non sono rilevabili dal Wiimote
ma possono essere individuati se si dispone del WiiMotionPlus, che verrà successivamente
trattato nella sezione estensioni.

                                                                                         11
3.3 Puntamento Infrarosso
Il Wiimote contiene un ricevitore monocromo 128x96 con un elaboratore d’immagine
integrato. Il ricevitore si presenta come un filtro infrarosso nella custodia di plastica del
telecomando. L’elaboratore d’immagine è capace di puntare fino a quattro oggetti in
movimento, e questi sono gli unici dati che trasmette all’host; i dati relativi ai pixel grezzi
“visti” dalla telecamera non sono raggiungibili dall’host, pertanto il ricevitore non può
essere usato per catturare immagini. Il processore integrato effettua un’analisi sub pixel 8x
per fornire una risoluzione 1024x768 dei punti tracciati.

3.3.1          Sensor Bar
La Wii dispone di una Sensor Bar contenente due gruppi di LED IR (infrarossi), che
vengono tracciati dal Wiimote per fornire informazioni sul puntamento. La distanza tra i
centri dei gruppi di LED è 20cm. La Sensor Bar non svolge nessun compito se non quello
di supporto e alimentazione (tramite un cavetto particolare che la collega alla console) ai
LED IR: funge in pratica soltanto da emettitore infrarosso.
I LED IR costituiscono i punti di riferimento per il ricevitore infrarosso del Wiimote:
questa correlazione permette di sfruttare un tecnica di puntamento nelle applicazioni; i
valori letti vengono spesso elaborati e convertiti ad esempio per l’uso di un cursore
governato dal movimento del telecomando.

                                     Figura 3: Sensor Bar

                                                                                            12
3.3.2          Tecnica di puntamento
La prospettiva derivante dalla combinazione degli angoli (verticale e orizzontale) tra il
ricevitore e la Sensor Bar, può far apparire quest’ultima in una posizione in cui non si trova
realmente, ma attraverso semplici relazioni trigonometriche è possibile individuare lo
sfasamento degli angoli tra gli emettitori e il ricevitore.
Il primo passo dell’algoritmo di puntamento è la localizzazione della Sensor Bar. Poiché
potrebbero essere presenti fonti IR spurie, si rivela indispensabile individuare con
precisione i due punti che più probabilmente corrispondono alla Sensor Bar. Per far questo
si cercano due punti orizzontalmente allineati distanziati da uno spazio minimo predefinito
(per rimuovere ogni possibile riferimento duplicato se il Wiimote rilevasse più punti
raggruppati    intorno    ad    un    emettitore    IR),      usando   l’inclinazione   calcolata
dall’accelerometro per determinare qual è il piano orizzontale cui riferirsi. Le coppie
contraddistinte da un margine di sfasamento dal piano orizzontale superiore ai 10° vengono
scartate. Tra le rimanenti coppie, vengono scelte le due che più si avvicinano al piano
orizzontale; una coppia di punti con un terzo punto molto vicino alla linea immaginaria tra
di essi viene scartata, in quanto non è possibile che vi sia un emettitore IR tra gli estremi,
pertanto quella coppia non può essere la Sensor Bar.
Se il Wiimote smarrisce il puntamento di una delle estremità, che può scomparire dalla
vista una volta avvicinatosi ai bordi dell’area di puntamento o quando ne esce, il
telecomando tenta di proseguire usando il solo punto rimanente cercando di intuire la
posizione del punto scomparso, ad esempio usando i valori della distanza (fissa) tra i due
punti e i valori dell’accelerometro per calcolare l’angolo.

3.3.3          Posizione di puntamento
Noti i due punti della Sensor Bar, viene ruotato il campo del sensore per farli apparire in
allineamento orizzontale (usando i valori dell’accelerometro per assicurare di essere
nell’esatto quadrante, ad esempio se il Wiimote fosse sottosopra). Si può probabilmente
applicare almeno un filtro di base di movimento medio per ridurre gli scatti. Una volta
mappata la Sensor Bar in un sistema di coordinate orizzontali, si può semplicemente
calcolare la posizione intermedia tra i due punti e usarla per calcolare la posizione del

                                                                                              13
puntatore definendo un quadro per mappare lo schermo su di esso. La posizione di questo
quadro può variare a seconda del luogo di posizionamento della Sensor Bar (sopra o sotto
lo schermo). Il quadro dovrebbe essere proporzionatamente dimensionato in modo da
accomodare più angoli senza aree morte. Una posizione di puntamento approssimata può
essere calcolata mediante l’uso delle seguenti formule:

Rotation = Math.Atan2(Accelerometer.Z, Accelerometer.X) - (float)(Math.PI / 2.0);

Position = (1 - Midpoint.x, Midpoint.y);

Position.Subtract(0.5,0.5);
Position.Rotate(Rotation);
Position.Add(0.5,0.5)

Se il punto intermedio non fosse disponibile si può usare il punto rimanente e comparare la
sua posizione corrente con la sua posizione quando entrambi i punti erano visibili.

3.3.4           Levigatura del cursore
La conversione dei dati rilevati dal ricevitore IR in informazioni per il posizionamento di
un cursore nello schermo consente a diverse applicazioni di sfruttare la tecnica di
puntamento nel loro funzionamento. Questa tecnica risulta particolarmente vantaggiosa nei
menu e nelle GUI; per queste applicazioni sarebbe auspicabile un filtraggio della posizione
del cursore. Una strategia per questo scopo è l’implementazione di uno schema circolare
trascinabile; Il software disegna un cerchio immaginario attorno alla nuova posizione
puntata; se il cursore si sposta al di fuori del cerchio, viene immediatamente trascinato al
suo interno. In ogni caso, se il cursore si trova già all’interno del cerchio, si muoverà in
direzione del centro ad una velocità proporzionale alla distanza dal centro. Questa tecnica
“leviga” il movimento del cursore e fa si che alcune piccole vibrazioni fisiche non
muovano drasticamente il cursore, consentendo comunque piccole correzioni.
Un’altra opzione è un algoritmo che corregge più attentamente la posizione quando il
Wiimote si muove lentamente e dà maggiore tolleranza in corrispondenza di movimenti
veloci. L’aspetto complesso di questo metodo sta nella difficoltà di apporto di piccole
correzioni quando il telecomando viene mosso di pochi pixel.

                                                                                         14
3.4 Altre funzionalità
3.4.1          LED
Sul lato frontale del Wiimote sono presenti quattro LED azzurri. Durante la modalità di
rilevazione e prima dell’inizializzazione, questi LED lampeggiano assieme. Il numero dei
LED che lampeggiano è proporzionale alla tensione sulla batteria, e indica la carica delle
pile (tutti e quattro indicano batterie completamente cariche, e un led soltanto indica che le
batterie stanno per esaurirsi e andrebbero sostituite). Il Wiimote è alimentato da due pile di
tipo AA. Quando il Wiimote è sincronizzato alla console, uno dei LED è acceso e indica il
numero giocatore assegnato dalla console al telecomando (fino a quattro giocatori). I LED
sono comunque indipendentemente controllabili dall’host, e possono essere accesi o spenti
a piacimento dal software. I LED possono anche essere modulati ad una comunque
moderata alta frequenza, abilitando un controllo di luminosità occupando però parecchia
banda Bluetooth. I LED sono montati sulla parte superiore del circuito, alimentati a 2.66 V
DC.

3.4.2          Rumble
Il Wiimote include una funzionalità di vibrazione, la cui implementazione consiste in un
piccolo motore unito a un peso decentrato (Rumble Pack). Il motore può essere attivato o
fermato attraverso un Output Report. Non tutti i Wiimote montano lo stesso motore; uno di
questi è il SEM 8728DA, alimentato a 3.3 V DC e a 35 mA.

3.4.3          Speaker
Il telecomando contiene un piccolo altoparlante di 21 mm piezo-elettrico di bassa qualità,
usato per brevi effetti sonori durante il gioco. I suoni provengono direttamente dall’host e
lo speaker ha qualche parametro regolabile. L’altoparlante è controllato tramite tre Output
Report assieme a una sezione del registro indirizzi del Wiimote.

                                                                                           15
3.5 Estensioni
Il Wiimote dispone di un connettore d’espansione a 6 pin che consente di connettervi
periferiche esterne. La comunicazione è bi-direzionale seriale e sincrona (il protocollo è
sconosciuto); le estensioni forniscono un blocco virtuale di registro mappato in una
porzione dello spazio indirizzi del Wiimote; la comunicazione è crittografata. I dispositivi
qui elencati sono tutte estensioni del Wiimote ad esso connesse tramite il connettore di cui
sopra, fatta eccezione per la Balance Board che comunica direttamente con l’host via
Bluetooth.

3.5.1         Nunchuk
È un telecomando di forma ovoidale leggermente più piccolo del Wiimote, dotato di un
accelerometro a tre assi simile a quello del Wiimote, di un joystick analogico, due pulsanti
dorsali (C e Z) e un microcontroller. La posizione centrale del joystick viene calibrata al
collegamento del Nunchuk al Wiimote, con un meccanismo finora sconosciuto. I due
potenziometri (30KΩ) che controllano gli assi del joystick sono collegati in parallelo. Il
chip di controllo dell’accelerometro è il LIS3L02 di STMicroelectronics.

                            Figura 4: Nunchuk collegato al Wiimote

                                                                                         16
3.5.2          Classic Controller
È un controller tradizionale, utilizzabile come seconda scelta in giochi che lo supportano; è
provvisto di 15 pulsanti, due dei quali sono trigger analogici e forniscono sia lo stato di
“click” una misura della pressione ad essi impressa, e due joystick analogici.
Sul lato frontale del controller sono posizionati i joystick e 11 dei pulsanti standard: A, B, -
, Home, +, X, Y, Up, Down, Left, Right. Sul lato superiore si trovano i trigger e gli altri
due pulsanti: Z e L; sono posizionati in modo da essere premibili con gli indici.
I trigger (destro e sinistro) sono sensibili a forze; alla pressione di un trigger, un
meccanismo fa scorrere un potenziometro lineare da 30KΩ. Il meccanismo utilizza solo un
quarto della distanza massima percorribile dal potenziometro. Al termine di uno
spostamento derivante da una pressione viene chiuso uno switch; il trigger è considerato
premuto appieno quando viene chiuso anche lo switch in fondo al percorso del
potenziometro.
Tutti i sei potenziometri nel dispositivo (due relativi a ogni trigger e due per ognuno dei
joystick) sono collegati in parallelo.

3.5.3          Wii Motion Plus
È un accessorio che migliora le prestazioni del Wiimote rendendolo molto più preciso e
realistico. Esso permette di compiere movimenti con il telecomando che saranno mappati
1:1 dalla console; in pratica vengono recepiti tutti i movimenti 3D compiuti nello spazio,
rilevati con altissima precisione. Il dispositivo ha una propria porta d’espansione che
consente di collegarvi ad esempio un Nunchuk, permettendo così l’uso di entrambe le
estensioni.
Il Wii Motion Plus contiene due giro sensori: un giroscopio a due assi (IDG-600 di
InvenSense) per il rilevamento di Pitch e Roll, e un giroscopio monoasse (X3500W di
EPSON TOYOCOM) per il rilevamento di Yaw. L’uso combinato dei due giroscopi abilita
il dispositivo alla lettura della velocità angolare in tutti e tre gli assi, consentendo così un
orientamento completo. In Figura 2 sono rappresentati i movimenti Pitch, Roll e Yaw
rilevabili dal Wii Motion Plus.

                                                                                             17
3.5.4          Wii Balance Board
La Wii Balance Board è una pedana che comunica via Bluetooth direttamente con la
console. È composta da quattro bilance che rilevano lo spostamento del peso dell’utente
che si posiziona sopra di essa, permette quindi di usare gli spostamenti del corpo per
controllare le azioni di gioco. La Balance Board è effettivamente un’estensione nonostante
non la si possa collegare fisicamente al connettore del Wiimote, tuttavia è utilizzabile
anche in assenza di un Wiimote in quanto appare alla console come un Wiimote con un
“Balance Board extension controller” permanentemente connesso, e trasmette i propri dati
alla console in maniera del tutto simile ad un’estensione connessa a un Wiimote.
I dispositivi di misurazione della Balance Board sono quattro estensimetri, incorporati in
ciascuno dei piedini su cui la pedana poggia al suolo. Il principio di funzionamento di
questi sensori è la misura della resistenza elettrica di un sottile filo di metallo posto al loro
interno, che aumenta all’allungamento del filo; l’estensione del filo è proporzionale alla
sollecitazione (forza peso) che il sensore subisce.
Grazie alla disposizione dei sensori ai quattro angoli della pedana, questa periferica è in
grado di misurare l’indice di massa corporea, analizzare la posizione del baricentro e il
peso corporeo. Nella versione europea la Balance Board può sostenere fino a un peso di
150Kg. La trasmissione dei dati misurati è continua, e avviene con un rate di 60 fps.

                                  Figura 5: Wii Balance Board

                                                                                              18
Capitolo 4. Interfacciamento e
connessione dei dispositivi
In questo capitolo vengono esposte le tecnologie e i meccanismi mediante i quali avviene
la connessione tra i controller di Nintendo Wii e l’host (console o pc).

4.1 HID [5]
Gli Human Interface Device (HID) sono dispositivi che interagiscono direttamente con
l’utente. Sono tipicamente dispositivi di input, ma spesso emettono anche output. Il
termine HID viene spesso associato alla specifica USB-HID, termine coniato da Mike Van
Flandern (Microsoft) quando propose al comitato USB la creazione di un gruppo di lavoro
per lo sviluppo delle tecnologie dei dispositivi di input. Il gruppo venne rinominato e
nacque la Human Interface Device class, che denota la comunicazione bi-direzionale
supportata dallo standard.
Le motivazioni principali che portarono alla nascita di HID furono l’abilitazione di
innovazioni per i dispositivi di input e la semplificazione del processo di installazione di
tali dispositivi.

4.1.1           L’innovazione di HID
Prima della nascita di HID, i dispositivi di input erano tipicamente utilizzati mediante
protocolli restrittivi per mouse, tastiere e joystick. L’innovazione dell’hardware ha
richiesto modifiche a protocolli esistenti o la creazione di driver personalizzati con
conseguente pubblicazione di nuovi protocolli per gli sviluppatori di applicazioni.
I dispositivi HID rilasciano dei pacchetti autodescrittivi che potrebbero contenere
un’infinità di tipi di dati e formati. Un singolo driver HID installato in un PC analizza i dati
e abilita l’associazione dinamica di informazioni di I/O con le funzionalità applicative.

                                                                                             19
Molti sistemi operativi possono riconoscere dispositivi USB-HID, come mouse o tastiere,
anche senza l’utilizzo di un driver, e in questo caso un dispositivo viene riconosciuto come
“HID-compliant device”.

4.1.2          Il protocollo HID
Il protocollo HID si compone di due entità: l’host e il device. Il device è l’entità che
interagisce direttamente con l’utente, mentre l’host comunica con il device ricevendo (o
trasmettendo) dati in risposta ad azioni compiute dall’utente. Gli host sono tipicamente pc,
ma possono anche essere telefoni cellulari, PDA e console.
Il protocollo HID traduce l’implementazione dei dispositivi in modelli molto semplici. I
dispositivi definiscono un proprio pacchetto dati e quindi presentano all’host un “HID
descriptor”, che contiene la descrizione del contenuto del pacchetto dati. Le informazioni
contenute nel descrittore sono: il numero di pacchetti supportati dal dispositivo, lo spazio
occupato da ogni pacchetto e il significato di ciascun byte nel pacchetto. Tipicamente
l’HID descriptor è memorizzato in una ROM all’interno del dispositivo.
L’host è un’entità molto più complessa del device. Ad esso spetta il compito di ricevere
l’HID descriptor dal device ed analizzarlo allo scopo finale di comunicare in modo
pienamente funzionale con il device.

4.1.3          Bluetooth HID
Il Bluetooth HID è una versione derivante dal protocollo HID definito per USB, alleggerita
e adattata alla tecnologia della trasmissione Bluetooth. Questo permette il riutilizzo di
alcune delle già esistenti funzionalità per USB-HID per il supporto di Bluetooth HID.
Il profilo HID descrive il modo in cui utilizzare il protocollo USB-HID per rilevare una
classe di driver USB-HID preesistente, dalla quale estrarre un set di funzionalità della
classe HID del dispositivo; il profilo descrive inoltre come un dispositivo Bluetooth
supporta servizi HID che sfruttano il livello L2CAP. Il profilo HID è progettato al fine di
abilitare, inizializzare e controllare dispositivi auto-descriventi e di fornire una connessione
a bassa latenza con bassi requisiti di alimentazione.

                                                                                             20
Il Wiimote e la Balance Board usano entrambi allo stesso modo il protocollo Bluetooth
HID standard per comunicare con l’host, quello che cambia è l’identificativo con cui
vengono individuati e associati all’host: il Wiimote viene riconosciuto come “Nintendo
RVL-CNT-01”, mentre la Balance Board come “Nintendo RVL-WBC-01”.

4.2 Bluetooth [6]
Il Wiimote si interfaccia alla console mediante la tecnologia Bluetooth, grazie a un
dispositivo BCM2042 di Broadcom. Il Wiimote e la Balance Board utilizzano il protocollo
HID Bluetooth standard per comunicare con l’host, direttamente basato sull’USB HID
standard. Grazie a questa caratteristica essi possono essere rilevati come dispositivi di
input standard da un qualunque host Bluetooth, quale ad esempio un pc dotato di scheda di
rete Bluetooth o di un adattatore USB (una chiavetta Bluetooth). Viene quindi introdotta la
possibilità di utilizzare il Wiimote e la Balance Board come dispositivi di input per
applicazioni per pc, svincolandosi così da un loro uso esclusivo con la console Wii.

4.2.1          BlueSoleil [7]
I primi tentativi di connessione dei dispositivi al pc hanno esito positivo, ma mostrano una
carenza di affidabilità della connessione in quanto spesso essa si disattiva senza preavviso
e non garantisce una continuità della comunicazione tra l’host e il device. La soluzione a
questo problema è stata raggiunta con la sostituzione del software standard del sistema
operativo che gestisce la rete e i dispositivi Bluetooth con un software avanzato e provvisto
di migliori funzionalità.
Questo software è BlueSoleil di IVT; è un’applicazione che consente a pc abilitati
Bluetooth di collegarsi ad altre periferiche abilitate Bluetooth, ma anche di creare reti e
scambiare dati tra dispositivi.

                                                                                          21
Figura 6: IVT Bluesoleil

Funzione Bluetooth (Profilo)                                      Client         Server
Advanced Audio Bluetooth                                            √               √

Auricolare e microfono Bluetooth                                                    √

Connessione remota Bluetooth                                        √

FAX Bluetooth                                                       √

Trasferimento file Bluetooth                                        √               √

Periferica d'interfaccia umana (HID) Bluetooth                      √

OPP (Object Push) Bluetooth                                         √               √

PAN (Personal Area Network) Bluetooth                               √               √

Stampa Bluetooth                                                    √

Porta seriale Bluetooth                                             √               √

Tabella 1: Profili Bluetooth supportati da BlueSoleil

Come illustrato in Tabella 1, BlueSoleil dispone di diverse funzionalità operative sulle reti
Bluetooth. Il software consente la gestione delle reti sia nella erogazione dei servizi
(Server) che nell’accesso a servizi (Client).

4.2.2           Connessione del Wiimote
Il Wiimote viene rilevato dal software come Bluetooth HID (Joystick), e identificato
attraverso un id univoco; Esso non richiede alcuna autenticazione o cifratura,
l’interfacciamento consiste nella pressione contemporanea dei tasti 1 e 2 o del tasto rosso
di sincronizzazione all’interno del coperchio delle batterie, che porta il Wiimote nella

                                                                                          22
modalità di rilevazione nella quale viene accoppiato all’host (console o pc) mediante il
driver Bluetooth-HID. A sincronizzazione avvenuta, il Wiimote dirige automaticamente i
propri pacchetti verso l’host a cui è accoppiato.
L’interfacciamento con la console Wii è automatico una volta che il Wiimote viene portato
in modalità di rilevazione, in quanto la console si accoppia automaticamente al dispositivo
e vi associa un indice da 1 a 4 (alla console si possono interfacciare fino a 4 Wiimote
contemporaneamente) che viene normalmente indicato dall’accensione di uno dei 4 led sul
dispositivo.
Per connettere il Wiimote a un pc è invece necessario anzitutto effettuare nel software
BlueSoleil una ricerca dispositivi Bluetooth: se il Wiimote si trova in modalità di
rilevazione, esso viene trovato, ma non accoppiato. Occorre mantenere il Wiimote nella
modalità di rilevazione e indicare al software di connettere l’host al dispositivo. Se
l’operazione ha esito positivo l’icona relativa al dispositivo diventa verde. In Figura 7 è
mostrata la notifica della fase di sincronizzazione del dispositivo.

                              Figura 7: Sincronizzazione Wiimote

Tuttavia il Wiimote è inutilizzabile dai driver standard HID in quanto non usa né la
tipologia standard di dati né lo stesso descrittore HID, ma si limita a fornire la lunghezza
del pacchetto, senza descriverne il contenuto; questo aspetto ha reso necessaria la
creazione di alcuni driver Wiimote.
Il Wiimote utilizza un set di operazioni abbastanza complesso, trasmesse tramite il canale
HID di output, e restituisce attraverso il canale di input differenti pacchetti contenenti dati
provenienti dalle sue periferiche interne.
La connessione della Balance Board avviene in modo del tutto analogo.

                                                                                            23
4.3 Wiimotelib
Wiimotelib è una libreria .NET sviluppata da Brian Peek [8], che consente ad una
applicazione .NET di interfacciarsi a un controller Wiimote e alle varie estensioni esistenti.
Diverse versioni di questa libreria sono disponibili su CodePlex [9]. Gli algoritmi mediante
i quali la libreria abilita la comunicazione con il dispositivo sono descritti nei paragrafi
seguenti [10].

4.3.1             Creazione del canale di comunicazione
Quando il Wiimote e la Balance Board vengono sincronizzati con il pc, sono identificati
come HID-compliant devices, ma i loro pacchetti non sono decodificabili. Pertanto, per
connettersi funzionalmente ai dispositivi, occorre utilizzare le API di Win32 per la
gestione dei dispositivi HID; queste API sono definite nel Windows Driver Kit (WDK).
Non essendo disponibile in .NET un supporto integrato per tali API, diventa necessaria
l’introduzione di uno strumento che permetta di chiamare direttamente i metodi delle API
da .NET: questo strumento è P/Invoke. La difficoltà di questo passaggio consiste nella
ricerca della corretta signature per ogni metodo e le definizioni delle strutture che
introducono propriamente i dati attraverso Win32. Wiimotelib è scritta in C#, e i metodi
inerenti P/Invoke sono contenuti nella classe HIDImports.
Il processo attraverso il quale la libreria apre la comunicazione con il Wiimote (o con la
Balance Board, che come detto è considerata a tutti gli effetti un Wiimote) si compone dei
seguenti passi:
   1. Trovare il GUID della classe HID definita da Windows
   2. Trovare un gestore della lista di tutti i dispositivi che fanno parte di tale classe
   3. Enumerare l’insieme di questi dispositivi e ottenere informazioni dettagliate
       riguardo ognuno di essi
   4. Comparare Vendor ID e Product ID di ognuno dei dispositivi della classe con i già
       noti VID e PID del Wiimote
   5. Una volta trovata la classe corrispondente, creare un FileStream per ricevere o
       inviare dati al dispositivo
   6. Svuotare la lista dei dispositivi

                                                                                             24
Viene qui riportato il codice C# che esegue i passaggi precedentemente descritti:
// read/write handle to the device
private SafeFileHandle mHandle;

// a pretty .NET stream to read/write from/to
private FileStream mStream;
bool found = false;
Guid guid;
uint index = 0;

// 1. get the GUID of the HID class
HIDImports.HidD_GetHidGuid(out guid);

// 2. get a handle to all devices that are part of the HID class
IntPtr hDevInfo = HIDImports.SetupDiGetClassDevs(ref guid, null, IntPtr.Zero,
HIDImports.DIGCF_DEVICEINTERFACE);// | HIDImports.DIGCF_PRESENT);

// create a new interface data struct and initialize its size
HIDImports.SP_DEVICE_INTERFACE_DATA diData = new HIDImports.SP_DEVICE_INTERFACE_DATA();
diData.cbSize = Marshal.SizeOf(diData);

// 3. get a device interface to a single device (enumerate all devices)
while(HIDImports.SetupDiEnumDeviceInterfaces(hDevInfo, IntPtr.Zero, ref guid, index, ref diData))
{
    // create a detail struct and set its size
    HIDImports.SP_DEVICE_INTERFACE_DETAIL_DATA diDetail = new
HIDImports.SP_DEVICE_INTERFACE_DETAIL_DATA();
    diDetail.cbSize = 5; //should be: (uint)Marshal.SizeOf(diDetail);, but that's the wrong size

    UInt32 size = 0;

    // get the buffer size for this device detail instance (returned in the size parameter)
    HIDImports.SetupDiGetDeviceInterfaceDetail(hDevInfo, ref diData, IntPtr.Zero, 0, out size,
IntPtr.Zero);

    // actually get the detail struct
    if(HIDImports.SetupDiGetDeviceInterfaceDetail(hDevInfo, ref diData, ref diDetail, size, out
size, IntPtr.Zero))
    {
        // open a read/write handle to our device using the DevicePath returned
        mHandle = HIDImports.CreateFile(diDetail.DevicePath, FileAccess.ReadWrite,
FileShare.ReadWrite, IntPtr.Zero, FileMode.Open, HIDImports.EFileAttributes.Overlapped,
IntPtr.Zero);

        // 4. create an attributes struct and initialize the size
        HIDImports.HIDD_ATTRIBUTES attrib = new HIDImports.HIDD_ATTRIBUTES();
        attrib.Size = Marshal.SizeOf(attrib);

        // get the attributes of the current device
        if(HIDImports.HidD_GetAttributes(mHandle.DangerousGetHandle(), ref attrib))
        {
             // if the vendor and product IDs match up
             if(attrib.VendorID == VID && attrib.ProductID == PID)
             {

                                                                                                    25
// 5. create a nice .NET FileStream wrapping the handle above
                   mStream = new FileStream(mHandle, FileAccess.ReadWrite, REPORT_LENGTH, true);
            }
            else
                   mHandle.Close();
        }
    }

    // move to the next device
    index++;
}

// 6. clean up our list
HIDImports.SetupDiDestroyDeviceInfoList(hDevInfo);

4.3.2              Trasmissione dei pacchetti
Nel mondo di HID, i dati vengono trasmessi sotto forma di report, sono cioè blocchi di dati
di lunghezza predefinita e fissa con un header che descrive il report contenuto nel blocco.
Il Wiimote trasmette e riceve vari report, ognuno dei quali ha una lunghezza di 22 byte.
Una volta creato il FileStream su cui comunicare con il Wiimote, è possibile aprire la
trasmissione dei dati. Poiché i report saranno trasmessi e ricevuti quasi sempre in modo
continuo, è essenziale l’uso di operazioni di I/O asincrone; in .NET questo è
particolarmente semplice. Il processo consiste nell’avviare un’operazione asincrona di
lettura e fornire un metodo di risposta quando il buffer si riempie; terminato il metodo di
risposta, i dati sono stati manipolati e il processo può essere ripetuto.
// report length
private const int REPORT_LENGTH = 22;

// report buffer
private byte[] mBuff = new byte[REPORT_LENGTH];

private void BeginAsyncRead()
{
    // if the stream is valid and ready
    if(mStream.CanRead)
    {
        // create a read buffer of the report size
        byte[] buff = new byte[REPORT_LENGTH];

        // setup the read and the callback
        mStream.BeginRead(buff, 0, REPORT_LENGTH, new AsyncCallback(OnReadData), buff);
    }
}

private void OnReadData(IAsyncResult ar)
{

                                                                                                   26
// grab the byte buffer
    byte[] buff = (byte[])ar.AsyncState;

    // end the current read
    mStream.EndRead(ar);

    // start reading again
    BeginAsyncRead();

    // handle data....
}

Questo è il codice sufficiente ad aprire e avviare la comunicazione con il Wiimote. Il resto
del codice comporta l’analisi dei dati ricevuti dal dispositivo e l’invio di dati
adeguatamente formati al Wiimote. Si può inviare un qualunque comando al Wiimote
attraverso il seguente codice:
mStream.Write(mBuff, 0, REPORT_LENGTH);

                                                                                         27
Capitolo 5. Ambiente di Sviluppo
L’ambiente di sviluppo dell’applicazione è XNA Game Studio 3.1, estensione di Microsoft
Visual Studio. Il linguaggio di programmazione utilizzato è C#.
È stato possibile utilizzare l’edizione 2008 Professional di Visual Studio grazie alla licenza
studenti per il Politecnico di Milano distribuita dall’MSDN Academic Alliance [11].

5.1 Microsoft Visual Studio 2008 [12]
È un IDE (Integrated Development Environment) di Microsoft, con nome in codice Orcas,
ed è uno strumento rivolto a sviluppatori di piattaforme Windows e .NET Framework 3.
Incorpora svariati linguaggi di programmazione tra i quali VB.NET, C#, C++ e altri
ancora. Offre inoltre la possibilità di creare applicazioni e servizi Web ASP.NET. Visual
Studio 2008 richiede il .NET Framework 3.5 che è stato rilasciato assieme all’IDE il 19
Novembre 2007, e per default compila su tale framework le applicazioni ma supporta
anche la compilazioni degli assembly nelle versioni precedenti del framework. Il debugger
di Visual Studio include funzionalità che semplificano il debug di applicazioni multi-
thread.

5.2 C# [13]
C# (C Sharp) è un linguaggio di programmazione Object-Oriented sviluppato da Microsoft
all’interno dell’iniziativa .NET, e successivamente approvato come standard ECMA
(associazione attualmente responsabile per molti standard).
La sintassi del codice C# prende spunto da Delphi [14] (del medesimo autore, Anders
Hejlsberg), da C++, da Java e Visual Basic per gli strumenti di programmazione visuale e
per la semplicità.
C# è il linguaggio che meglio descrive le linee guida del funzionamento di un’applicazione
.NET; i suoi tipi di dati primitivi hanno una corrispondenza univoca con i tipi .NET e
molte delle sue astrazioni come classi, interfacce, delegati ed eccezioni sono
particolarmente adatte a gestire il .NET Framework.

                                                                                           28
5.3 Il Framework XNA [15]
Microsoft XNA (Xna is Not Acronymed) è un insieme di strumenti per la progettazione, lo
sviluppo e la gestione di software per videogiochi contraddistinto dalla semplicità del
processo di creazione, poiché evita al programmatore l’inserimento di parti inutili di codice
e consente l’appoggio a un framework unificato, che contiene tutti i set di istruzioni utili
per un videogame. XNA attualmente comprende l’intera sezione di sviluppo videogiochi di
Microsoft, incluso lo standard Xbox Development Kit.
Il Framework XNA è basato sul .NET Framework 2.0 per Windows e sul .NET Compact
Framework 2.0 per Xbox 360, pertanto è virtualmente supportato da tutti i linguaggi .NET,
anche se è consigliato l’uso di C#. Esso appoggia sulle librerie grafiche di Microsoft
DirectX e incapsula tutti i dettagli di basso livello riguardanti lo sviluppo del videogioco,
risparmiando questo compito allo sviluppatore che può concentrarsi sul contenuto e
sull’esperienza di gioco in quanto sarà il framework a gestire le varie piattaforme di gioco;
sono inoltre presenti numerosi strumenti per la creazione di contenuti, come editor di
suono, visuali e di modelli.
Microsoft ha rilasciato degli IDE specifici per il game design (XNA Game Studio), che si
possono installare come estensione dell’IDE principale (Visual Studio), così come il
Framework XNA viene installato come estensione del .NET Framework.

5.4 Struttura di un progetto XNA [16]
La colonna portante di un progetto XNA è una classe di tipo Game. Questa classe è
implementata alla creazione di ogni progetto XNA e gestisce l’intera applicazione
attraverso dei metodi predefiniti.
In un progetto XNA è possibile separare le varie parti dell’applicazione mediante l’uso di
vari GameComponents, ciascuno dei quali possiede metodi predefiniti ereditabili dalla
classe Game.

                                                                                          29
Puoi anche leggere