Interazioni tramite tocco nello sviluppo di giochi per Windows Phone 7 Parte 2 Multitouch
Programmazione! - 2.Prova il multi-touch
Informazioni su questo esempio
Qui, vorrei spiegare il programma per realizzare input multi-touch. In Windows Phone 7, l'input multi-touch tramite touch panel è uno degli elementi più importanti per l'input dell'utente. Questo perché, a differenza di Windows e Xbox 360, l'interfaccia di input principale è il "pannello a sfioramento". Ci possono essere telefoni Windows con tastiere, ma ovviamente non sempre li hanno. Quindi, affinché il gioco funzioni su qualsiasi Windows Phone, deve essere touch-able.
Se si limita il pannello a sfioramento al solo "singolo tocco", i tipi di giochi che possono essere realizzati saranno inevitabilmente limitati quando si tratta di creare giochi. Pensa a una console di gioco portatile (puoi lasciarla ferma). La maggior parte delle console di gioco richiede di tenere il controller di gioco (o la console reale) con entrambe le mani e premere più pulsanti contemporaneamente.
Windows Phone 7 non ha tanti pulsanti quanti i controller di gioco e non ha necessariamente una tastiera. Pertanto, i tasti e i pulsanti virtuali possono essere posizionati sullo schermo e, quando li si preme, è scomodo perché non possono essere premuti contemporaneamente con un solo tocco.
Naturalmente, oltre all'esempio del pulsante virtuale sopra, il multi-touch è necessario per i giochi in cui più persone utilizzano uno schermo, come "pizzica e allunga (sposta due punti più vicini o più lontani)" che è comune nel multi-touch.
A proposito, l'introduzione è lunga, ma in questo esempio, vorrei acquisire informazioni multi-touch utilizzando una classe dedicata ai pannelli a sfioramento. È divertente creare un campione che può essere riprodotto con il multi-touch all'improvviso, ma prima vorrei scoprire che tipo di informazioni possono essere ottenute con il multi-touch. Ci sono alcune abitudini, quindi conoscendole prima, puoi ridurre il tempo trascorso a indagare sulla causa, ad esempio quando non funziona bene nella programmazione successiva.
Obiettivi di questo programma di esempio
Visualizzare e confermare le informazioni quando viene eseguito il multi-touch.
Figura 1: Le informazioni sul tocco vengono visualizzate come testo quando vengono toccate
Programma - Dichiarazione dei campi
I campi devono essere etichettati TouchPanelCapabilities Structure e TouchCollection Structure.
<summary>
スプライトでテキストを描画するためのフォント
</summary>
SpriteFont font;
<summary>
タッチパネルの機能情報
</summary>
TouchPanelCapabilities capabilities;
<summary>
取得したタッチ情報の一覧
</summary>
TouchCollection touches;
La "struttura TouchPanelCapabilities" è una struttura che può avere le funzioni del pannello a sfioramento stesso come parametri. Viene utilizzato per verificare se il pannello a sfioramento può essere utilizzato durante l'aggiornamento.
La struttura TouchCollection contiene un elenco di informazioni sullo stato attualmente toccato. Se vengono rilevati più tocchi, è possibile recuperare più "strutture TouchLocation". Ne parleremo più avanti.
Programma - Caricamento dei font
Prima di disegnare il testo sullo schermo, aggiungere la definizione del tipo di carattere al progetto di contenuto e caricarla con il metodo Game.LoadContent. Questo non è direttamente correlato ai pannelli a sfioramento, quindi ometterò una spiegazione dettagliata.
Figura 2: Aggiungere "Font.spritefont" al progetto di contenuto
// フォントをコンテンツパイプラインから読み込む
font = Content.Load<SpriteFont>("Font");
Programma - Ottieni informazioni sul pannello a sfioramento
Ottieni le informazioni sul pannello a sfioramento all'interno del metodo Game.Update.
// タッチパネルの機能情報を取得
capabilities = TouchPanel.GetCapabilities();
// タッチパネルが使用可能であるかチェック
if (capabilities.IsConnected)
{
// 現在のタッチパネルの入力情報を取得
touches = TouchPanel.GetState();
}
È possibile chiamare il metodo "TouchPanel.GetCapabilities" per ottenere le informazioni sulla funzione del pannello a sfioramento. Esistono due tipi di informazioni che possono essere acquisite: "È possibile utilizzare il pannello a sfioramento?" e "Numero massimo di punti di contatto che possono essere acquisiti dal pannello a sfioramento". Nessuno dei due cambia durante il gioco, quindi penso che non ci siano problemi se lo ottieni secondo il metodo Game.Initialize, ma in futuro vengono visualizzati i dispositivi che possono rimuovere il pannello a sfioramento (pannello a sfioramento che può essere collegato a USB o dispositivi reali diversi da Windows Phone) ed è descritto nel metodo Update.
Inoltre, non è necessario verificare se il pannello a sfioramento può essere utilizzato perché può sempre essere utilizzato su Windows Phone 7, ma quando si condivide il codice con Windows e Xbox 360, questi hardware non sono interfacce di input necessarie e devono essere controllati.
Se è possibile verificare che il pannello di tocco sia disponibile nella proprietà "TouchPanelCapabilities.IsConnected", il metodo "TouchPanel.GetState" ottiene lo stato di tocco corrente.
Originariamente, alcune operazioni di elaborazione vengono eseguite dopo l'acquisizione delle informazioni sul tocco, ma in questo esempio vengono visualizzate solo le informazioni, pertanto non viene eseguita alcuna ulteriore elaborazione nel metodo Game.Update.
Programma - Ottieni il numero massimo di punti di contatto che puoi ottenere
Il numero massimo di punti di contatto che possono essere recuperati è approssimativamente fisso, quindi non è spesso necessario recuperarli durante il gioco, ma è possibile ottenere il numero massimo di punti di contatto che possono essere recuperati dalla proprietà TouchPanelCapabilities.MaximumTouchCount. Ad esempio, se la proprietà MaximumTouchCount è "4", non è possibile ottenere le informazioni sulla quinta posizione toccando il pannello a sfioramento con cinque dita.
Il numero di acquisizioni per lo smartphone "HTC 7 Trophy" utilizzato in questo campione è stato "4". A proposito, XNA Game Studio 4.0 è definito per restituire sempre 4. La specifica di Windows Phone 7 dice che è più di 4 punti, quindi non restituisce meno di 4.)
// タッチ可能な最大数を表示
spriteBatch.DrawString(font,
"MaximumTouchCount : " +
capabilities.MaximumTouchCount,
new Vector2(20, 50),
Color.LightGreen);
Figura 3: Conteggio dei recuperi delle proprietà TouchPanelCapabilities.MaximumTouchCount
Programma - Ottieni informazioni sul tocco
La struttura TouchCollection recuperata contiene più informazioni sul tocco. Ad esempio, se tocchi con due dita, di solito contiene due tocchi.
Il numero di informazioni sul tocco può essere recuperato nella proprietà TouchCollection.Count. Le informazioni sul tocco vengono visualizzate ripetutamente nell'istruzione for tutte le volte che vengono ottenute. Originariamente, non c'è alcun problema a eseguire il loop con foreach, ma poiché useremo l'indice di matrice (indice int) nella spiegazione successiva, lo ripeteremo con for.
// タッチ情報の数だけループする
for (int index = 0; index < touches.Count; index++)
{
// 指定したインデックスのタッチ情報取得
TouchLocation tl = touches[index];
// タッチ情報を可視化
string mes = "Index : " + index + Environment.NewLine +
"Id : " + tl.Id + Environment.NewLine +
"Position : " + tl.Position + Environment.NewLine +
"State : " + tl.State;
// 文字の描画
spriteBatch.DrawString(font,
mes,
new Vector2(30 + (index % 4) * 10,
80 + index * 140),
Color.White);
}
Ora, ogni informazione tattile viene ottenuta come struttura "TouchLocation". Se è in loop con for, può essere ottenuto con "TouchCollection[index]". (Puoi anche ottenere la struttura "TouchLocation" direttamente in foreach.)
I quattro tipi di informazioni seguenti possono essere ottenuti dalla struttura "TouchLocation" e ogni informazione viene visualizzata nell'esempio.
Quando lo esegui effettivamente, le informazioni sul tocco vengono visualizzate come mostrato di seguito. Dal momento che stai toccando con tre dita, puoi vedere tre tocchi. A proposito, se tocchi con cinque dita, ne vedrai solo quattro. (Perché il numero massimo di acquisizioni è 4)
Figura 4: Toccare con tre dita
Programma - A cosa prestare attenzione quando si recuperano le informazioni sul tocco 1 (indice e ID)
Ho detto sopra che ci sono cose da tenere a mente quando si tratta di informazioni tattili, ma il primo è "indice" e "ID". Un indice si riferisce semplicemente a un indice di matrice.
Penso che sia più facile da capire se lo provi su una macchina reale piuttosto che spiegarlo per iscritto. Ad esempio, supponiamo che tu operi con due dita, "indice" e "medio", e tocchi prima con l'indice.
Figura 5: Toccare con l'indice
Come mostrato sullo schermo, l'indice sarà "0". Quindi toccalo con il dito medio.
Figura 6: tocco del dito medio
In questo stato, si tocca con due dita, quindi vengono visualizzate due informazioni. L'indice toccato con il dito medio è "1".
Alziamo il dito indice qui. Quindi le informazioni sul tocco saranno simili alle seguenti.
Figura 7: Rilasciare il dito indice
Come avrai notato ormai, l'indice delle informazioni che stai toccando con il dito medio è "0". Se gestisci il carattere per indice quando lo sposti, l'operazione precedente porterà alle seguenti azioni.
・ Sposta il carattere "A" con il dito indice
↓
・ Sposta il carattere "B" con il dito medio in quello stato.
↓
・ Rilascia il dito indice mentre muovi il carattere con il dito medio
↓
・ Il carattere controllato dal dito medio passa improvvisamente ad "A"
Un altro fenomeno è che se rilasci o tocchi ripetutamente una delle due dita mentre le tocchi, il testo del disegno delle prime informazioni tattili potrebbe sfarfallare. Questo perché il secondo dito interrompe l'indice "0" nel momento in cui lo tocchi o lo rilasci.
Come accennato in precedenza, l'indice e l'ordine delle informazioni di tocco quando il tocco multitocco non corrispondono all'ordine in cui vengono toccati. Pertanto, se si desidera eseguire operazioni, non gestirle nell'indice TouchCollection.
Ciò che dovrebbe essere gestito è che la struttura "TouchLocation" ha una proprietà "Id" e l'ID viene riscritto con un nuovo valore ogni volta che viene toccato, ma la relazione tra il touchpoint e l'ID è garantita durante il tocco, quindi lo gestiremo.
Naturalmente, questo non significa che devi gestirlo tramite ID e, in alcuni casi, la posizione touch da sola è sufficiente. Ad esempio, se si tocca semplicemente un pulsante sullo schermo, è possibile determinare che è stato premuto un pulsante controllando la posizione del tocco indipendentemente dall'ID. Tuttavia, quando si include l'elaborazione della resistenza, la posizione cambia sempre, quindi penso che dovrebbe ancora essere determinata dall'ID.
Programma - Cose da tenere a mente quando si acquisiscono informazioni sul tocco 2 (numero di informazioni tattili acquisite)
Sebbene non sia incluso nel programma dell'articolo, l'esempio disegna la stringa "GetMaxTouchCount" nella parte inferiore dello schermo e "il numero massimo di informazioni sul tocco acquisite contemporaneamente". In questo modo è stato visualizzato il numero massimo di informazioni sul tocco acquisite dal metodo "TouchPanel.GetState" in passato, ma in questo computer di test la proprietà "TouchPanelCapabilities.MaximumTouchCount" è 4, pertanto il valore massimo visualizzato qui dovrebbe in genere essere 4. Se metti cinque dita su di esso, sarà ancora 4.
Figura 8: Numero a cinque dita
Facciamo un piccolo esperimento. Prova a ripetere il pannello a sfioramento con più dita ad alta velocità. Dipende dalla macchina di prova, ma il numero potrebbe superare 4 prima che tu te ne accorga.
Figura 9: GetMaxTouchCount è maggiore di 4
In effetti, le informazioni di tocco acquisite dal metodo "TouchPanel.GetState" non sono le informazioni di tocco al momento della chiamata al metodo "TouchPanel.GetState", ma il momento in cui lo si tocca e il momento in cui lo si rilascia dall'ultimo tempo di aggiornamento vengono memorizzati nella cache. Pertanto, anche se è possibile rilevare fino a quattro tocchi contemporaneamente, toccare nuovamente lo stesso dito viene considerato come un tocco separato, pertanto è possibile ottenere più informazioni sul tocco rispetto a TouchPanelCapabilities.MaximumTouchCount.
Pertanto, anche se TouchPanelCapabilities.MaximumTouchCount è 4, se il numero di elementi di matrice dei dati relativi al tocco è fissato per 4, potrebbe verificarsi un errore di sovraccarico dell'indice a seconda del metodo di elaborazione.
A proposito, nella guida di XNA Game Studio, il valore massimo della proprietà TouchCollection.Count è descritto come "8", quindi se si desidera correggere il numero di elementi nella matrice, è necessario impostare il numero di elementi su almeno 8. Se si pensa agli aggiornamenti di versione futuri, è possibile includere una clausola di protezione in modo che l'indice non venga superato.
Riepilogo di questo esempio
Questa volta, abbiamo esaminato vari parametri per le informazioni ottenute dal multi-touch. Abbiamo anche confermato che ci sono alcuni punti da tenere a mente quando si acquisiscono informazioni sul pannello a sfioramento. Sulla base di questa conoscenza, vorrei spiegare un esempio che utilizza effettivamente il multi-touch.