Il TouchPanel ci permette di leggere lo stato dell'input sul display sensibile al tocco di un Windows Phone. Tale display supporta almeno quattro tocchi in contemporanea, ma potrebbe supportarne anche di più a seconda del modello di telefono.
Il touchscreen è molto particolare, in quanto non è né continuo né discreto: a seconda di come l'utente esegue il tocco (un tocco rapido oppure un trascinamento) il risultato sará interpretabile come una informazione discreta oppure continua. Addirittura in alcuni giochi sta emergendo la possibilitá di usare lo schermo del telefono come se supportasse dei thumbsticks, interpretando piccoli trascinamenti e pressioni prolungate in certe aree dello schermo come i movimenti di un thumbstick rilevando la distanza della pressione dal centro del thumbstick virtuale:
La classe TouchPanel (inclusa nel namespace Microsoft.Xna.Framework.Input.Touch
) espone alcune proprietà statiche particolarmente interessanti, in quanto consentono di impostare il sistema di coordinate del TouchPanel in modo da tenere conto, ad esempio, delle operazioni di rotazione del device. Si tratta delle seguenti proprietà:
int DisplayWidth { get; set; }
int DisplayHeight { get; set; }
DisplayOrientation DisplayOrientation { get; set; }
DisplayWidth
e DisplayHeight
consentono di specificare le dimensioni dell'area di input, mentre la terza proprietà consiste in un enum di tipo DisplayOrientation
che può assumere i seguenti valori:
Default = 0,
LandscapeLeft = 1,
LandscapeRight = 2,
Portrait = 4,
come si può intuire dal nome, DisplayOrientation
indica l'orientamento del dispositivo di touch e, di conseguenza, in quale punto si colloca l'origine del sistema di coordinate (0,0
). Quest'ultimo non deve necessariamente coincidere con il punto di origine utilizzato per le operazioni di disegno a schermo. Ad esempio, se abbiamo impostato il device per supportare la modalità Portrait e aggiungiamo le seguenti righe:
TouchPanel.DisplayOrientation = DisplayOrientation.LandscapeLeft;
TouchPanel.DisplayWidth = 800;
TouchPanel.DisplayHeight = 480;
Vedremo che l'origine degli assi X
e Y
per il dispositivo touch sarà collocato nell'angolo in alto a destra, mentre le operazioni di disegno continueranno ad avere la loro origine nell'angolo in alto a sinistra.
Per acquisire informazioni sullo stato e sulle capacità del touch pad, TouchPanel mette a disposizione il metodo statico
TouchPanel.GetCapabilities()
il quale ritorna una struttura di tipo TouchPanelCapabilities
. A sua volta, tale struttura espone due proprietà interessanti:
Proprietà TouchPanelCapabilities | Descrizione |
---|---|
bool IsConnected {get;} |
da non confondere con la proprietà IsGestureAvailable esposta dalla classe TouchPanel (di cui ci occuperemo fra breve) tale proprietà indica se il device effettivamente supporta il dispositivo di touch |
int MaximumTouchCount {get;} |
permette invece di determinare il numero massimo di punti di contatto che possono essere "intercettati" contemporaneamente dallo specifico device utilizzato (4 o più nel caso di Windows Phone 7) |
Leggere l'input con GetState
Un primo modo, invero piuttosto "grezzo", di leggere l'input proveniente dal touch panel consiste nell'utilizzare il metodo statico TouchPanel.GetState(), che ritorna una collezione di tipo TouchCollection:
public struct TouchCollection : IList, ICollection, IEnumerable, IEnumerable
Una TouchCollection
non è altro che una collezione di TouchLocation, ciascuna delle quali a sua volta rappresenta un singolo tocco sullo schermo.
TouchCollection
implementa una serie di interfacce che consentono di:
- aggiungere o togliere elementi alla collezione (
TouchCollection.Add
,TouchCollection.Remove
eTouchCollection.RemoveAt
) - cercare un elemento per ID (
TouchCollection.FindByID
) - scorrere la collezione di
TouchLocation
mediante un ciclofor
oforeach
(grazie all'implementazione dell'interfacciaIEnumerable<TouchLocation>
)
.
Ciascuna TouchLocation contiene una serie di informazioni relative al singolo tocco. In particolare:
Proprietà di TouchLocation | Descrizione |
---|---|
int Id {get;} | Rappresenta l'id di ciascun singolo tocco, in modo da poter identificare univocamente lo stesso tocco anche tra successivi passaggi dal metodo Update |
Vector2 Position {get;} | Contiene le informazioni (in float) circa la posizione del tocco lungo i due assi X e Y |
TouchLocationState State {get;} | Indica lo stato di un tocco, ossia se il punto di contatto è ancora premuto, se è stato rilasciato, oppure se si sta spostando:
public enum TouchLocationState { Invalid = 0, Released = 1, Pressed = 2, Moved = 3, } |