Per rilevare i gesti sul TouchPanel del telefono, occorre introdurre una nuova variabile di tipo GestureSample
a livello di classe, in grado di registrare gli input dell'utente:
[...]
GamePadState currGamePadState;
GestureSample gesture;
SpriteFont font;
[...]
Tra le proprietà esposte da GestureSample tre ci torneranno particolarmente utili in questa demo:
Proprietà | Descrizione |
---|---|
GestureType | Indica il tipo di gesto compiuto dall'utente |
Position | raccoglie le informazioni circa il punto di contatto sul device |
Delta | un vettore che indica la distanza tra due punti (nel flick, ad esempio, lo spostamento compiuto dal momento della pressione al momento del rilascio del contatto) |
GestureType
Quanto ai tipi di gesti dell'utente che è possibile "intercettare", è importante ricordare che Windows Phone 7 supporta una serie di gesti predefiniti che ci semplificano di gran lunga la vita. Questi gesti sono elencati nell'enum GestureType:
public enum GestureType
{
None = 0,
Tap = 1, // tocco singolo
DoubleTap = 2, // doppio tocco rapido
Hold = 4,
HorizontalDrag = 8, // trascinamento orizzontale
VerticalDrag = 16, // trascinamento verticale
FreeDrag = 32, // trascinamento lungo i due assi
Pinch = 64, // il gesto di "pizzicare" lo schermo con due dita
Flick = 128, // il gesto di trascinare il dito sullo schermo
DragComplete = 256, // drag concluso
PinchComplete = 512, // pinch concluso
}
Position
Indica le coordinate del punto di contatto, espresse mediante un Vector2
(esiste anche una proprietà Position2, utilizzata dal solo pinch, per indicare la posizione del secondo dito).
Delta
È lo spostamento del tocco rispetto al punto iniziale. Nel caso di un flick, essa indica la velocità dello spostamento, espressa in pixel per secondo (esiste anche un Delta2 per indicare lo spostamento del secondo dito nel caso di un pinch).
Nota:: è anche possibile prescindere dai tipi predefiniti di gesti messi a disposizione dal framework per andare a leggere direttamente l'input "grezzo" sul touch panel mediante il metodo statico TouchPanel.GetState(), il quale ritorna una collezione di TouchLocation
(ciascuna delle quali rappresenta uno specifico tocco sul device).
Alcuni approfondimenti sull'input in XNA si trovano sulle pagine della guida a XNA di HTML.it a firma di G. Maggiore e V. Boncinelli.
EnabledGestures
Prima di poter rilevare il tocco, è necessario specificare quali gesti ci interessano mediante la proprietà EnabledGestures della classe TouchPanel
. (Attenzione! Non farlo comporta un'eccezione a runtime).
Questa proprietà permette di indicare uno ad uno i gesti supportati dal device, separandoli con l'operatore logico OR (|
). Nel nostro caso, limitiamoci ad utilizzare i tre gesti più semplici: Tap, DoubleTap e Flick. Per questo, aggiungiamo la seguente riga nel costruttore di Game1.cs
:
TouchPanel.EnabledGestures = GestureType.Tap | GestureType.DoubleTap | GestureType.Flick;
Già che ci siamo, aggiungiamo anche alcune variabili a livello di classe per memorizzare le informazioni sui gesti compiuti:
// salva le info relative al tipo di gesture
string gestureTypeText = "Touch not available yet";
// salva le info relative alla posizione del touch
string touchPositionText = "Touch not available yet";
Fatto questo, passiamo ad inserire, nel metodo Update, il codice necessario a rilevare i gesti compiuti dall'utente:
// Controlla che ci sia un nuovo gesture non processato
while (TouchPanel.IsGestureAvailable)
{
// legge il touchPanel
Gesture = TouchPanel.ReadGesture();
// memorizza il tipo di gesture
gestureTypeText = "Last gesture type: " + Gesture.GestureType.ToString();
// se si tratta di un tap o di un doppio tap, salva la posizione del punto di contatto
if (Gesture.GestureType == GestureType.Tap || Gesture.GestureType == GestureType.DoubleTap)
touchPositionText = string.Format("X: {0} - Y : {1}", Gesture.Position.X, Gesture.Position.Y);
// se è un flick, mostra il delta
else if (Gesture.GestureType == GestureType.Flick)
touchPositionText = string.Format("Delta X: {0} - Delta Y: {1}", Gesture.Delta.X, Gesture.Delta.Y);
}
Non ci resta altro che scrivere a schermo il risultato delle nostre letture, utilizzando il solito metodo DrawString
:
// GamePad Text
spriteBatch.DrawString(font, gamepadText, new Vector2(10, 20), Color.White);
// Touchpad Text
spriteBatch.DrawString(font, gestureTypeText, new Vector2(10, 60), Color.White);
spriteBatch.DrawString(font, touchPositionText, new Vector2(10, 100), Color.White);
La prima chiamata al metodo DrawString
ci mostrerà il tipo dell'ultimo gesto compiuto dall'utente, mentre la seconda indicherà le coordinate X
e Y
del punto di contatto o, nel caso di un flick, il delta (ossia, come si è accennato, la velocità di spostamento espressa in pixels per secondo) per ciascuno degli assi.
Premiamo F5 ed ecco il risultato:
Nulla ci vieta di ampliare il semplice esempio proposto, abilitando nuovi gesti alla proprietà TouchPanel.EnabledGestures
e scrivendo a schermo la posizione e il delta del nuovo gesto.