Per iniziare a lavorare creiamo un nuovo progetto (dal menu di Visual Studio: File > New project > Windows Phone Game (4.0)
) e chiamiamolo SimpleInputManager
. Abbiamo già fatto le considerazioni generali sul template di un progetto XNA, cominciamo adesso a lavorare sul GamePad.
XNA fornisce una serie di classi (molte delle nel namespace Microsoft.Xna.Framework.Input
) per la gestione degli input dalle diverse periferiche.
GamePadState, in particolare, è la classe (o meglio, la structure
) esposta dal framework per leggere gli input provenienti da un gamepad per XBox 360 (nel nostro caso, dal bottone Indietro di WP7).
Tra i metodi esposti da questa classe ve ne sono due che ci forniranno gran parte delle funzionalità da utilizzare nei nostri giochi:
GamePadState è appunto la classe (o, meglio, la structure) esposta dal framework per leggere gli input provenienti da un gamepad per XBox 360 (ovvero, come nel nostro caso, dal bottone di Back della nostra periferica WP7). Tra i metodi esposti dalla classe ve ne sono due, in particolare, che ci forniranno gran parte delle funzionalità di cui avremo bisogno nei nostri giochi:
Metodo | Descrizione |
---|---|
bool IsButtonDown(Buttons) |
determina se un buttone è premuto (pressed) |
bool isButtonUp(Buttons) |
determina se un bottone è sollevato (not pressed) |
Aggiungiamo quindi due variabili di tipo GamePadState
di cui avremo bisogno più avanti per memorizzare gli input provenienti dal GamePad, più una terza variabile di tipo string per mostrare a video lo stato del gamepad. Queste tre variabili andranno ad aggiungersi alle due (graphics
e spriteBatch
) già incluse di default nel template:
public class Game : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
GamePadState prevGamePadState;
GamePadState currGamePadState;
string gamepadText = "No button pressed yet";
// ...
}
Nel metodo Update
, ora possiamo leggere lo stato corrente di bottoni e joystick (o thumbstick, quando presenti). Salviamo l'input corrente in currGamePadState
, mentre prevGamePadState
ci servirà per conservare traccia dell'input precedente:
// Salva lo stato corrente del GamePad
prevGamePadState = currGamePadState;
// Legge un nuovo stato del GamePad
currGamePadState = GamePad.GetState(PlayerIndex.One);
Per leggere lo stato del gamepad è necessario ricorrere al metodo statico GetState(PlayerIndex playerIndex)
della classe GamePad
, il quale accetta come parametro un enum
che specifica il controller associato ad ogni giocatore. Lo riportiamo di seguito a scopo puramente illustrativo:
public enum PlayerIndex
{
One = 0, // Primo controller
Two = 1, // Secondo controller
Three = 2, // Terzo controller
Four = 3, // Quarto controller
}
Anche sotto questo punto di vista la gestione del GamePad su WP7 si presenta dunque semplificata rispetto alle altre piattoforme (dove possono coesistere fino a quattro gamePad), dal momento che è possibile avere un solo e unico "gamePad" connesso (e per di più, con un solo bottone!).