Interaccions tàctils en el desenvolupament de jocs per a Windows Phone 7 Part 2 Multitouch

Pàgina actualitzada :
Data de creació de la pàgina :

Programació! - 2.Prova multitàctil

Sobre aquesta mostra

Aquí, m'agradaria explicar el programa per realitzar l'entrada multitàctil. Al Windows Phone 7, l'entrada multitàctil mitjançant el tauler tàctil és un dels elements més importants per a l'entrada de l'usuari. Això es deu al fet que, a diferència de Windows i Xbox 360, la interfície d'entrada principal és el "tauler tàctil". Pot haver-hi telèfons Windows amb teclats, però per descomptat no sempre els tenen. Per tant, perquè el joc funcioni en qualsevol Windows Phone, ha de ser tàctil.

Si limiteu el tauler tàctil només a "toc únic", els tipus de jocs que es poden fer inevitablement es limitaran a l'hora de fer jocs. Penseu en una consola de jocs de mà (podeu deixar-la estacionària). La majoria de les consoles de jocs requereixen que mantingueu premut el controlador del joc (o la consola real) amb les dues mans i premeu diversos botons alhora.

El Windows Phone 7 no té tants botons com els controladors de jocs i no necessàriament té teclat. Per tant, es poden col·locar tecles i botons virtuals a la pantalla i, en prémer-los, és inconvenient perquè no es poden prémer simultàniament amb un sol toc.

Per descomptat, a més de l'exemple de botó virtual anterior, el multitàctil és necessari per a jocs on diverses persones operen una pantalla, com ara "pessigar i estirar (moure dos punts més a prop o més lluny)" que és comú en multitàctil.

Per cert, la introducció és llarga, però en aquesta mostra, m'agradaria adquirir informació multitàctil mitjançant una classe dedicada als panells tàctils. És divertit crear una mostra que es pugui jugar amb multitàctil de sobte, però primer m'agradaria esbrinar quin tipus d'informació es pot obtenir amb multitàctil. Hi ha alguns hàbits, de manera que coneixent-los primer, podeu reduir el temps dedicat a investigar la causa, com ara quan no funciona bé en la programació posterior.

Objectius d'aquest programa de mostra

Visualitzeu i confirmeu la informació quan es realitzen diversos retocs.

図 1 :タッチしたときにタッチ情報がテキストで表示される
Figura 1: la informació tàctil es mostra com a text quan es toca

Programa - Declaració de Camps

Els camps s'han d'etiquetar TouchPanelCapabilities Structure i TouchCollection Structure.

/// <summary>
///  スプライトでテキストを描画するためのフォント
/// </summary>
SpriteFont font;

/// <summary>
///  タッチパネルの機能情報
/// </summary>
TouchPanelCapabilities capabilities;

/// <summary>
///  取得したタッチ情報の一覧
/// </summary>
TouchCollection touches;

El "TouchPanelCapabilities structure" és una estructura que pot tenir les funcions del propi panell tàctil com a paràmetres. S'utilitza per comprovar si el tauler tàctil es pot utilitzar durant l'actualització.

L'estructura TouchCollection conté una llista d'informació sobre l'estat actualment tocat. Si es detecten diversos tocs, es poden recuperar diverses "estructures de touchlocation". Més sobre això més endavant.

Programa - Carregant tipus de lletra

Abans de dibuixar text a la pantalla, afegiu la definició del tipus de lletra al vostre projecte de contingut i carregueu-lo amb el mètode Game.LoadContent. Això no està directament relacionat amb els panells tàctils, de manera que ometré una explicació detallada.

図 2 :コンテンツプロジェクトに「Font.spritefont」を追加しておく
Figura 2: Afegiu "Font.spritefont" al vostre projecte de contingut

// フォントをコンテンツパイプラインから読み込む
font = Content.Load<SpriteFont>("Font");

Programa - Obtenir informació del panell tàctil

Obteniu la informació del tauler tàctil dins del mètode Game.Update.

// タッチパネルの機能情報を取得
capabilities = TouchPanel.GetCapabilities();

// タッチパネルが使用可能であるかチェック
if (capabilities.IsConnected)
{
  // 現在のタッチパネルの入力情報を取得
  touches = TouchPanel.GetState();
}

Podeu trucar al mètode "TouchPanel.GetCapabilities" per obtenir la informació de la funció del tauler tàctil. Hi ha dos tipus d'informació que es poden adquirir: "Es pot utilitzar el panell tàctil?" i "Nombre màxim de punts de contacte que pot adquirir el panell tàctil". Cap d'ells canvia durant el joc, així que crec que no hi ha cap problema si l'obteniu segons el mètode Game.Initialize, però en el futur apareixen dispositius que poden eliminar el tauler tàctil (tauler tàctil que es pot connectar a USB o dispositius reals diferents de Windows Phone) i es descriu al mètode Update.

A més, no cal comprovar si el tauler tàctil es pot utilitzar perquè sempre es pot utilitzar a Windows Phone 7, però quan es comparteix codi amb Windows i Xbox 360, aquest maquinari no requereix interfícies d'entrada i cal comprovar-ho.

Si podeu confirmar que el tauler tàctil està disponible a la propietat "TouchPanelCapabilities.IsConnected", el mètode "TouchPanel.GetState" obté l'estat tàctil actual.

Originalment, alguns processaments d'operacions es realitzen després d'adquirir informació tàctil, però en aquesta mostra només es mostra informació, de manera que no es fa cap processament addicional al mètode Game.Update.

Programa - Obteniu el màxim nombre de punts de contacte que podeu obtenir

El nombre màxim de punts de contacte que es poden recuperar és aproximadament fix, de manera que sovint no és necessari recuperar-los durant el joc, però podeu obtenir el màxim nombre de punts de contacte que es poden recuperar des de la propietat TouchPanelCapabilities.MaximumTouchCount. Per exemple, si la propietat MaximumTouchCount és "4", no podeu obtenir la informació de la cinquena posició tocant el tauler tàctil amb cinc dits.

El nombre d'adquisicions per al telèfon intel·ligent "HTC 7 Trophy" utilitzat en aquesta mostra va ser de "4". (Per cert, XNA Game Studio 4.0 es defineix per tornar sempre 4.) L'especificació de Windows Phone 7 diu que és superior a 4 punts, de manera que no retorna menys de 4.)

// タッチ可能な最大数を表示
spriteBatch.DrawString(font,  
                       "MaximumTouchCount : " +
                         capabilities.MaximumTouchCount,
                       new Vector2(20, 50),
                       Color.LightGreen);

図 3 :TouchPanelCapabilities.MaximumTouchCount プロパティの取得数
Figura 3: TouchPanelCapabilities.MaximumTouchCount Recompte de recuperació de propietats

Programa - Obtenir informació tàctil

L'estructura recuperada de TouchCollection conté múltiples informacions tàctils. Per exemple, si es toca amb dos dits, sol contenir dos tocs.

El nombre d'informació tàctil es pot recuperar a la propietat TouchCollection.Count. La informació tàctil es mostra repetidament a la declaració for tantes vegades com s'obté. Originalment, no hi ha cap problema per fer un bucle amb foreach, però com que utilitzarem l'índex de matriu (índex int) en l'explicació posterior, l'enllacem amb 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);
}

Ara, cada informació tàctil s'obté com una estructura de "TouchLocation". Si està en bucle amb for, es pot obtenir amb "TouchCollection[index]". (També podeu obtenir l'estructura "TouchLocation" directament a l'avantbraç.)

Els quatre tipus d'informació següents es poden obtenir a partir de l'estructura "TouchLocation" i cada informació es mostra a la mostra.

Quan realment l'executeu, la informació tàctil es mostra tal com es mostra a continuació. Com que estàs tocant amb tres dits, pots veure tres tocs. Per cert, si toques amb cinc dits, només en veuràs fins a quatre. (Perquè el nombre màxim d'adquisicions és de 4)

図 4 :3 本の指でタッチしているところ
Figura 4: Tocar amb tres dits

Programa: coses a tenir en compte a l'hora de recuperar la informació tàctil 1 (índex i identificador)

He esmentat anteriorment que hi ha coses a tenir en compte quan es tracta d'informació tàctil, però el primer és "índex" i "identificador". Un índex es refereix simplement a un índex de matrius.

Crec que és més fàcil entendre si ho proves en una màquina real que explicar-ho per escrit. Per exemple, suposem que opereu amb dos dits, "dit índex" i "dit del mig", i toqueu primer amb el dit índex.

図 5 :人差し指でタッチ
Figura 5: Tocar amb el dit índex

Tal com es mostra a la pantalla, l'índex serà "0". A continuació, toqueu-lo amb el dit del mig.

図 6 :中指でタッチ
Figura 6: Toc del dit del mig

En aquest estat, esteu tocant amb dos dits, de manera que es mostren dues informacions. L'índex tocat amb el dit del mig és "1".

Aixequem el dit índex aquí. A continuació, la informació tàctil es veurà com la següent.

図 7 :人差し指を放す
Figura 7: deixeu anar el dit índex

Com ja haureu notat, l'índex de la informació que esteu tocant amb el dit del mig és "0". Si gestioneu el caràcter per índex quan el moveu, l'operació anterior donarà lloc a les accions següents.

・ Mou el caràcter "A" amb el dit índex

・ Moveu el personatge "B" amb el dit del mig en aquest estat.

・ Deixeu anar el dit índex mentre moveu el personatge amb el dit del mig

・ El personatge controlat pel dit del mig canvia de sobte a "A"

Un altre fenomen és que si deixeu anar o toqueu repetidament un dels dos dits mentre els toqueu, el text de dibuix de la primera informació tàctil pot parpellejar. Això es deu al fet que el segon dit interromp l'índex "0" en el moment en què el toqueu o allibereu.

Com s'ha esmentat anteriorment, l'índex i l'ordre de la informació tàctil quan es multitàctil no coincideixen amb l'ordre en què es toquen. Per tant, si vols fer alguna operació, no les gestionis en l'índex TouchCollection.

El que s'ha de gestionar és que l'estructura "TouchLocation" tingui una propietat "Id", i l'identificador es reescrigui amb un valor nou cada vegada que es toqui, però la relació entre el punt de contacte i l'identificador està garantida mentre es toca, de manera que ho gestionarem.

Per descomptat, això no vol dir que l'hàgiu de gestionar mitjançant identificació i, en alguns casos, la posició tàctil per si sola és suficient. Per exemple, si només toqueu un botó de la pantalla, podeu determinar que heu premut un botó marcant la posició tàctil independentment de l'identificador. Tanmateix, quan s'inclou el processament d'arrossegament, la posició sempre canvia, de manera que crec que encara s'hauria de determinar mitjançant el DNI.

Programa - Coses a tenir en compte a l'hora d'adquirir informació tàctil 2 (nombre d'informació tàctil adquirida)

Tot i que no s'inclou al programa de l'article, la mostra dibuixa la cadena "GetMaxTouchCount" a la part inferior de la pantalla i "el nombre màxim d'informació tàctil adquirida al mateix temps". Això ha mostrat el nombre màxim d'informació tàctil adquirida pel mètode "TouchPanel.GetState" en el passat, però en aquesta màquina de prova, la propietat "TouchPanelCapabilities.MaximumTouchCount" és 4, de manera que el valor màxim que es mostra aquí normalment hauria de ser 4. Si hi poses cinc dits, encara seran 4.

図 8 :5 本の指を置いたときの数値
Figura 8: Número de cinc dits

Fem un petit experiment. Proveu de repetir el tauler tàctil amb diversos dits a gran velocitat. Depèn de la màquina de prova, però el nombre pot superar els 4 abans de saber-ho.

図 9 :GetMaxTouchCount が 4 を超えている
Figura 9: GetMaxTouchCount és superior a 4

De fet, la informació tàctil adquirida pel mètode "TouchPanel.GetState" no és la informació tàctil en el moment de trucar al mètode "TouchPanel.GetState", però el moment en què la toqueu i el moment en què l'allibereu de l'última actualització es desen a la memòria cau. Per tant, tot i que es poden detectar fins a quatre tocs alhora, tornar a tocar el mateix dit es tracta com un toc separat, de manera que es pot obtenir més informació tàctil que TouchPanelCapabilities.MaximumTouchCount.

Per tant, fins i tot si TouchPanelCapabilities.MaximumTouchCount és 4, si el nombre d'elements de matriu de dades relacionades amb el tacte es fixa per 4, es pot produir un error de sobreendeutament de l'índex en funció del mètode de processament.

Per cert, en l'ajuda de XNA Game Studio, el valor màxim de la propietat TouchCollection.Count es descriu com a "8", de manera que si vols fixar el nombre d'elements de la matriu, hauries d'establir el nombre d'elements com a mínim en 8. (Si penseu en futures actualitzacions de versions, és possible que vulgueu incloure una clàusula de guàrdia perquè l'índex no passi per sobre.)

Resum d'aquesta mostra

Aquesta vegada, hem examinat diversos paràmetres per a la informació obtinguda del multitàctil. També vam confirmar que hi ha alguns punts a tenir en compte a l'hora d'adquirir informació del panell tàctil. A partir d'aquests coneixements, m'agradaria explicar una mostra que realment utilitza multitàctil.