Interacțiuni tactile în dezvoltarea jocului pentru Windows Phone 7 Partea 2 Multitouch

Pagina actualizată :
Data creării paginii :

Programare! - 2.Try multi-touch

Despre acest eșantion

Aici, aș dori să explic programul pentru realizarea de intrare multi-touch. În Windows Phone 7, intrarea multi-touch prin intermediul panoului tactil este unul dintre cele mai importante elemente pentru introducerea de către utilizator. Acest lucru se datorează faptului că, spre deosebire de Windows și Xbox 360, interfața principală de intrare este "panoul tactil". Pot exista telefoane Windows cu tastaturi, dar, desigur, nu le au întotdeauna. Deci, pentru ca jocul să funcționeze pe orice Telefon Windows, trebuie să fie capabil de atingere.

Dacă limitați panoul tactil doar la "o singură atingere", tipurile de jocuri care pot fi făcute vor fi în mod inevitabil limitate atunci când vine vorba de a face jocuri. Gândiți-vă la o consolă de jocuri portabilă (o puteți lăsa staționară). Cele mai multe console de jocuri necesită să țineți controlerul de joc (sau consola reală) cu ambele mâini și să apăsați mai multe butoane în același timp.

Windows Phone 7 nu are la fel de multe butoane ca controlerele de joc și nu are neapărat o tastatură. Prin urmare, tastele și butoanele virtuale pot fi plasate pe ecran, iar atunci când le apăsați, este incomod, deoarece nu pot fi apăsate simultan cu o singură atingere.

Desigur, în plus față de exemplul butonului virtual de mai sus, multi-touch este necesar pentru jocurile în care mai multe persoane operează un singur ecran, cum ar fi "pinch and stretch (mutați două puncte mai aproape sau mai departe)", care este comun în multi-touch.

Apropo, introducerea este lungă, dar în acest eșantion, aș dori să obțin informații multi-touch folosind o clasă dedicată panourilor tactile. Este distractiv de a crea un eșantion care poate fi jucat cu multi-touch brusc, dar mai întâi aș dori să aflu ce fel de informații pot fi obținute cu multi-touch. Există unele obiceiuri, astfel încât, cunoscându-le mai întâi, puteți reduce timpul petrecut investigând cauza, cum ar fi atunci când nu funcționează bine în programare mai târziu.

Obiectivele acestui program de probă

Afișați și confirmați informațiile atunci când se efectuează multi-touch.

図 1 :タッチしたときにタッチ情報がテキストで表示される
Figura 1: Informațiile tactile sunt afișate ca text atunci când sunt atinse

Program - Declararea domeniilor

Câmpurile trebuie să fie etichetate TouchPanelCapabilities Structura și TouchCollection Structura.

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

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

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

"Structura TouchPanelCapabilities" este o structură care poate avea funcțiile panoului tactil în sine ca parametri. Este folosit pentru a verifica dacă panoul tactil poate fi utilizat în timpul actualizării.

Structura TouchCollection conține o listă de informații despre starea atinsă în prezent. Dacă sunt detectate mai multe atingeri, pot fi preluate mai multe "structuri de touchlocation". Mai multe despre asta mai târziu.

Program - Încărcarea fonturilor

Înainte de a desena text pe ecran, adăugați definiția fontului la proiectul de conținut și încărcați-o cu metoda Game.LoadContent. Acest lucru nu este direct legat de panourile tactile, așa că voi omite o explicație detaliată.

図 2 :コンテンツプロジェクトに「Font.spritefont」を追加しておく
Figura 2: Adăugați "Font.spritefont" la proiectul de conținut

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

Program - Obțineți informații despre panoul tactil

Obțineți informațiile panoului tactil în cadrul metodei Game.Update.

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

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

Puteți apela metoda "TouchPanel.GetCapabilities" pentru a obține informațiile despre funcția panoului tactil. Există două tipuri de informații care pot fi obținute: "Poate fi utilizat panoul tactil?" și "Numărul maxim de puncte de contact care pot fi achiziționate de panoul tactil". Niciuna dintre ele nu se schimbă în timpul jocului, așa că cred că nu există nicio problemă dacă o obțineți conform metodei Game.Initialize, dar în viitor apar dispozitive care pot elimina panoul tactil (panou tactil care poate fi conectat la USB sau dispozitive reale, altele decât Windows Phone) și este descris în metoda Actualizare.

De asemenea, nu este nevoie să verificați dacă panoul tactil poate fi utilizat, deoarece poate fi utilizat întotdeauna pe Windows Phone 7, dar atunci când partajați cod cu Windows și Xbox 360, aceste hardware nu sunt interfețe de intrare necesare și trebuie verificate.

Dacă puteți confirma că panoul tactil este disponibil în proprietatea "TouchPanelCapabilities.IsConnected", metoda "TouchPanel.GetState" primește starea tactilă curentă.

Inițial, unele operațiuni de procesare se efectuează după obținerea de informații tactile, dar în acest eșantion, informațiile sunt afișate numai, astfel încât nu se face nicio prelucrare ulterioară în metoda Game.Update.

Program - Obțineți numărul maxim de puncte de contact pe care le puteți obține

Numărul maxim de puncte de contact care pot fi preluate este aproximativ fix, deci nu este adesea necesar să le recuperați în timpul jocului, dar puteți obține numărul maxim de puncte de contact care pot fi recuperate din proprietatea TouchPanelCapabilities.MaximumTouchCount. De exemplu, dacă proprietatea MaximumTouchCount este "4", nu puteți obține informațiile despre poziția a cincea atingând panoul tactil cu cinci degete.

Numărul de achiziții pentru smartphone-ul "HTC 7 Trophy" folosit în acest eșantion a fost "4". (Apropo, XNA Game Studio 4.0 este definit pentru a reveni întotdeauna 4.) Specificația Windows Phone 7 spune că este mai mult de 4 puncte, deci nu returnează mai puțin de 4.)

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

図 3 :TouchPanelCapabilities.MaximumTouchCount プロパティの取得数
Figura 3: TouchPanelCapabilities.MaximumTouchCount property retrieval Count

Program - Obțineți informații tactile

Structura TouchCollection preluată conține mai multe informații tactile. De exemplu, dacă atingeți cu două degete, acesta conține de obicei două atingeri.

Numărul de informații tactile poate fi regăsit în proprietatea TouchCollection.Count. Informațiile tactile sunt afișate în mod repetat în instrucțiunea for de câte ori sunt obținute. Inițial, nu există nici o problemă pentru a bucla cu foreach, dar din moment ce vom folosi indexul matrice (int index) în explicația ulterioară, îl buclă cu pentru.

// タッチ情報の数だけループする
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);
}

Acum, fiecare informație tactilă este obținută ca o structură "TouchLocation". În cazul în care este looping cu for, acesta poate fi obținut cu "TouchCollection[index]". (Puteți obține, de asemenea, "TouchLocation" structura direct în foreach.)

Următoarele patru tipuri de informații pot fi obținute din structura "TouchLocation" și fiecare informație este afișată în eșantion.

Când îl rulați efectiv, informațiile tactile sunt afișate așa cum se arată mai jos. Din moment ce atingeți cu trei degete, puteți vedea trei atingeri. Apropo, dacă atingeți cu cinci degete, veți vedea doar până la patru. (Pentru ca numarul maxim de achizitii este de 4)

図 4 :3 本の指でタッチしているところ
Figura 4: Atingerea cu trei degete

Program - Lucruri de care trebuie să fiți atenți atunci când regăsiți informațiile tactile 1 (index și ID)

Am menționat mai sus că există lucruri de care trebuie să țineți cont atunci când aveți de-a face cu informații tactile, dar primul este "index" și "ID". Un index se referă pur și simplu la un index matrice.

Cred că este mai ușor de înțeles dacă îl încercați pe o mașină reală decât să-l explicați în scris. De exemplu, să presupunem că operați cu două degete, "degetul arătător" și "degetul mijlociu" și atingeți mai întâi cu degetul arătător.

図 5 :人差し指でタッチ
Figura 5: Atingerea cu degetul arătător

După cum se arată pe ecran, indexul va fi "0". Apoi atinge-l cu degetul mijlociu.

図 6 :中指でタッチ
Figura 6: Atingerea degetului mijlociu

În această stare, atingeți cu două degete, astfel încât sunt afișate două informații. Indexul atins cu degetul mijlociu este "1".

Să ridicăm degetul arătător aici. Apoi, informațiile tactile vor arăta ca următoarele.

図 7 :人差し指を放す
Figura 7: Eliberați degetul arătător

După cum probabil ați observat până acum, indexul informațiilor pe care le atingeți cu degetul mijlociu este "0". Dacă gestionați caracterul după index atunci când îl mutați, operațiunea de mai sus va duce la următoarele acțiuni.

・ Mutați caracterul "A" cu degetul arătător

・ Mutați caracterul "B" cu degetul mijlociu în această stare.

・ Eliberați degetul arătător în timp ce mutați personajul cu degetul mijlociu

・ Caracterul controlat de degetul mijlociu trece brusc la "A"

Un alt fenomen este că, dacă eliberați sau atingeți în mod repetat unul dintre cele două degete în timp ce le atingeți, textul desenului primei informații tactile poate pâlpâi. Acest lucru se datorează faptului că al doilea deget întrerupe indexul "0" în momentul în care îl atingeți sau îl eliberați.

După cum sa menționat mai sus, indexul și ordinea informațiilor tactile atunci când multi-touch nu se potrivesc cu ordinea în care sunt atinse. De aceea, dacă doriți să efectuați orice operațiuni, nu le gestionați în indexul TouchCollection.

Ceea ce ar trebui gestionat este faptul că structura "TouchLocation" are o proprietate "Id", iar Id-ul este rescris cu o nouă valoare de fiecare dată când este atins, dar relația dintre punctul de contact și ID-ul este garantată în timp ce atingeți, așa că o vom gestiona.

Desigur, acest lucru nu înseamnă că trebuie să-l gestionați prin ID și, în unele cazuri, poziția tactilă este suficientă. De exemplu, dacă atingeți doar un buton de pe ecran, puteți determina că ați apăsat un buton verificând poziția tactilă, indiferent de ID. Cu toate acestea, atunci când se include drag processing, poziția se schimbă întotdeauna, deci cred că ar trebui să fie în continuare determinată de ID.

Program - Lucruri de reținut atunci când obțineți informații tactile 2 (numărul de informații tactile obținute)

Deși nu este inclus în programul articolului, eșantionul desenează șirul "GetMaxTouchCount" din partea de jos a ecranului și "numărul maxim de informații tactile obținute în același timp". Acest lucru a afișat numărul maxim de informații tactile obținute prin metoda "TouchPanel.GetState" în trecut, dar în această mașină de testare, proprietatea "TouchPanelCapabilities.MaximumTouchCount" este 4, deci valoarea maximă afișată aici ar trebui să fie de obicei 4. Dacă puneți cinci degete pe el, acesta va fi în continuare 4.

図 8 :5 本の指を置いたときの数値
Figura 8: Numărul de cinci degete

Să facem un mic experiment. Încercați să repetați panoul tactil cu mai multe degete la viteză mare. Depinde de mașina de testare, dar numărul poate depăși 4 înainte de a-l cunoaște.

図 9 :GetMaxTouchCount が 4 を超えている
Figura 9: GetMaxTouchCount este mai mare decât 4

De fapt, informațiile tactile obținute prin metoda "TouchPanel.GetState" nu sunt informațiile tactile în momentul apelării metodei "TouchPanel.GetState", ci în momentul în care o atingeți și în momentul în care o eliberați din ultima sincronizare a actualizării sunt memorate în cache. Prin urmare, chiar dacă până la patru atingeri pot fi detectate în același timp, atingerea aceluiași deget din nou este tratată ca o atingere separată, astfel încât pot fi obținute mai multe informații tactile decât TouchPanelCapabilities.MaximumTouchCount.

Prin urmare, chiar dacă TouchPanelCapabilities.MaximumTouchCount este 4, dacă numărul de elemente matrice de date legate de atingere este fixat de 4, o eroare de suprasolicitare index poate apărea în funcție de metoda de procesare.

Apropo, cu ajutorul XNA Game Studio, valoarea maximă a proprietății TouchCollection.Count este descrisă ca "8", deci dacă doriți să remediați numărul de elemente din matrice, ar trebui să setați numărul de elemente la cel puțin 8. (Dacă vă gândiți la upgrade-urile viitoare ale versiunilor, poate doriți să includeți o clauză de protecție, astfel încât indexul să nu treacă peste.)

Rezumatul acestui eșantion

De data aceasta, am examinat diverși parametri pentru informațiile obținute din multi-touch. De asemenea, am confirmat că există câteva puncte de care trebuie să țineți cont atunci când obțineți informații despre panoul tactil. Pe baza acestor cunoștințe, aș dori să explic un eșantion care utilizează de fapt multi-touch.