Nei capitoli precedenti abbiamo introdotto alcuni concetti basilari di XNA, come il game loop, e abbiamo disegnato il nostro primo sprite 2D. In questo capitolo ci soffermeremo, invece, sulla gestione degli input in XNA, cercando di evidenziare al contempo le peculiarità dello sviluppo su WP7.
Non ci preoccuperemo di implementare un apposito GameComponent
per la gestione degli input (come invece sarebbe necessario), ma ci limiteremo a illustrare alcuni concetti basilari, lasciando le considerazioni architetturali ad altri approfondimenti.
La prima considerazione da fare riguarda le periferiche utilizzabili mediante XNA su WP7:
Dispositivo di input | Piattaforma | ||
---|---|---|---|
Windows Phone | XBOX 360 | Windows | |
GamePad | * | Sì | Sì |
Keyboard | Sì | Sì | Sì |
Mouse | Sì | Sì | |
TouchPanel | Sì | ||
Accelerometer | Sì | ||
Microphone | Sì | Sì | Sì |
(*) Su Windows Phone viene rilevato solo il tasto "Indietro"
Fonte: MSDN
Come si vede, rispetto alle altre piattaforme, Windows Phone può teoricamente contare su tutte le periferiche possibili, alle quali la nuova versione 7.1 di Windows Phone SDK aggiunge ulteriori possibilità, quali la bussola e il giroscopio, nonché delle API specifiche (denominate "Combined Motion API") in grado di fornire in modo combinato i dati relativi all'orientamento (attitude) del device intorno ai suoi tre assi X, Y e Z, con quelli relativi all'accelerazione e alla velocità di rotazione (per un elenco delle novità introdotte con il nuovo sistema operativo denominato "Mango" si veda questo link).
Per quanto riguarda in particolare il GamePad, è evidente come questi soffra di una evidente limitazione, potendo intercetare unicamente il tasto di Back. Guai però a pensare di lasciar perdere il GamePad su WP7 (in fondo si tratta di un solo bottone!), perché secondo i Windows Phone 7 Application Certification Requirements (che al momento in cui scriviamo queste righe sono alla versione 1.74) la mancata implementazione del tasto Back comporta automaticamente il rigetto dell'applicazione da parte del Windows MarketPlace.
Ciò detto, nelle prossime pagine ci occuperemo di implementare gli unici due device che non possono mancare in un'applicazione per WP7, ossia GamePad e TouchPanel.
Loop e polling
Per chi proviene da altri ambiti di programmazione, è opportuno precisare che in XNA la gestione degli input da parte degli utenti risente della particolare struttura per loop propria del framework. Mentre in Silverlight, ad esempio, l'input è "intercettato" dai controlli (es. un click su un bottone) e sono questi ultimi a sollevare i relativi eventi, in XNA l'assenza di controlli costringe a spostare la logica di input all'interno del ciclo:
Update -> Draw -> Update
Ciò comunque non esclude una gestione degli input basata principalmente su eventi, si può passare infatti da polling a eventi e viceversa
In pratica a ogni chiamata al metodo Update da parte del framework XNA, la nostra applicazione leggerà lo stato delle periferiche alla ricerca di eventuali input da parte dell'utente (il c.d. "polling").
Il metodo Update è chiamato dal framework a intervalli di tempo più o meno regolari (su WP7, di default, 30 volte al secondo, come indicato dalla proprietà TargetElapsedTime
), ciò significa che per la nostra applicazione dovrà interrogare il dispositivo altrettante volte per vedere se nel frattempo l'utente ha toccato lo schermo o premuto il pulsante "Indietro".