Dotykové interakcie pri vývoji hier pre Windows Phone 7, časť 2 Multitouch

Stránka aktualizovaná :
Dátum vytvorenia strany :

Programovanie! - 2.Vyskúšajte viacdotykové ovládanie

O tejto vzorke

Tu by som chcel vysvetliť program na realizáciu viacdotykového vstupu. Vo Windows Phone 7 je viacdotykový vstup cez dotykový panel jednou z najdôležitejších položiek pre vstup používateľa. Je to preto, že na rozdiel od systémov Windows a Xbox 360 je hlavným vstupným rozhraním "dotykový panel". Môžu existovať telefóny so systémom Windows s klávesnicami, ale samozrejme ich nemajú vždy. Aby teda hra fungovala na akomkoľvek Windows Phone, musí podporovať dotykové ovládanie.

Ak obmedzíte dotykový panel iba na "jeden dotyk", typy hier, ktoré je možné vytvoriť, budú nevyhnutne obmedzené, pokiaľ ide o tvorbu hier. Predstavte si vreckovú hernú konzolu (môžete ju nechať nehybnú). Väčšina herných konzol vyžaduje, aby ste držali herný ovládač (alebo skutočnú konzolu) oboma rukami a stlačili niekoľko tlačidiel súčasne.

Windows Phone 7 nemá toľko tlačidiel ako herné ovládače a nemusí mať nevyhnutne klávesnicu. Preto môžu byť virtuálne klávesy a tlačidlá umiestnené na obrazovke a pri ich stlačení je to nepohodlné, pretože sa nedajú stlačiť súčasne jediným dotykom.

Samozrejme, okrem vyššie uvedeného príkladu virtuálnych tlačidiel je viacdotykové ovládanie potrebné pre hry, v ktorých viacerí ľudia ovládajú jednu obrazovku, ako napríklad "stlačiť a natiahnuť (posunúť dva body bližšie alebo ďalej od seba)", čo je bežné pri viacdotykovom ovládaní.

Mimochodom, úvod je dlhý, ale v tejto vzorke by som chcel získať viacdotykové informácie pomocou triedy venovanej dotykovým panelom. Je zábavné vytvoriť vzorku, ktorú je možné hrať s viacdotykovým ovládaním, ale najprv by som chcel zistiť, aký druh informácií je možné získať pomocou multi-touch. Existujú určité návyky, takže tým, že ich poznáte ako prvé, môžete skrátiť čas strávený vyšetrovaním príčiny, napríklad keď to neskôr nefunguje dobre v programovaní.

Ciele tohto vzorového programu

Zobrazte a potvrďte informácie pri viacdotykovom ovládaní.

図 1 :タッチしたときにタッチ情報がテキストで表示される
Obrázok 1: Dotykové informácie sa pri dotyku zobrazia ako text

Program - Deklarovanie polí

Polia musia byť označené ako TouchPanelCapabilities Structure a TouchCollection Structure.

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

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

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

"Štruktúra TouchPanelCapabilities" je štruktúra, ktorá môže mať funkcie samotného dotykového panela ako parametre. Používa sa na kontrolu, či je možné počas aktualizácie použiť dotykový panel.

Štruktúra TouchCollection obsahuje zoznam informácií o aktuálne dotknutom stave. Ak sa zistí viac dotykov, je možné načítať viacero "štruktúr TouchLocation". Viac o tom neskôr.

Program - Načítanie písiem

Pred kreslením textu na obrazovku pridajte definíciu písma do projektu obsahu a načítajte ju metódou Game.LoadContent. To priamo nesúvisí s dotykovými panelmi, takže vynechám podrobné vysvetlenie.

図 2 :コンテンツプロジェクトに「Font.spritefont」を追加しておく
Obrázok 2: Pridajte "Font.spritefont" do svojho projektu obsahu

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

Program - Získajte informácie o dotykovom paneli

Získajte informácie o dotykovom paneli v rámci metódy Game.Update.

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

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

Môžete zavolať na metódu "TouchPanel.GetCapabilities", aby ste získali informácie o funkcii dotykového panela. Existujú dva typy informácií, ktoré je možné získať: "Je možné použiť dotykový panel?" a "Maximálny počet dotykových bodov, ktoré je možné získať na dotykovom paneli." Ani jeden z nich sa počas hry nemení, takže si myslím, že nie je problém, ak ho získate podľa metódy.Inicializujte metódu, ale v budúcnosti sa objavia zariadenia, ktoré dokážu odstrániť dotykový panel (dotykový panel, ktorý je možné pripojiť k USB alebo skutočným zariadeniam iným ako Windows Phone), a je to popísané v metóde aktualizácie.

Tiež nie je potrebné kontrolovať, či je možné použiť dotykový panel, pretože ho možno vždy použiť vo Windows Phone 7, ale pri zdieľaní kódu so systémami Windows a Xbox 360 sa tento hardvér nevyžaduje ako vstupné rozhrania a je potrebné ich skontrolovať.

Ak môžete potvrdiť, že dotykový panel je k dispozícii vo vlastnosti "TouchPanelCapabilities.IsConnected", metóda "TouchPanel.GetState" získa aktuálny stav dotyku.

Pôvodne sa určité spracovanie operácií vykonávalo po získaní dotykových informácií, ale v tejto vzorke sa informácie zobrazujú iba, takže pri metóde Game.Update sa nevykonáva žiadne ďalšie spracovanie.

Program - Získajte maximálny počet kontaktných bodov, ktoré môžete získať

Maximálny počet kontaktných bodov, ktoré je možné získať, je zhruba pevný, takže počas hry nie je často potrebné ich načítať, ale môžete získať maximálny počet dotykových bodov, ktoré je možné získať z vlastnosti TouchPanelCapabilities.MaximumTouchCount. Ak je napríklad vlastnosť MaximumTouchCount "4", informácie o piatej polohe nemôžete získať dotykom dotykového panela piatimi prstami.

Počet akvizícií pre smartfón "HTC 7 Trophy" použitý v tejto vzorke bol "4". (Mimochodom, XNA Game Studio 4.0 je definované tak, aby vždy vrátilo 4.) Špecifikácia Windows Phonu 7 hovorí, že je to viac ako 4 body, takže sa nevráti menej ako 4.)

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

図 3 :TouchPanelCapabilities.MaximumTouchCount プロパティの取得数
Obrázok 3: TouchPanelCapabilities.MaximumTouchCount Počet načítania vlastností

Program - Získanie dotykových informácií

Načítaná štruktúra TouchCollection obsahuje viacero dotykových informácií. Napríklad, ak sa dotknete dvoma prstami, zvyčajne obsahuje dva dotyky.

Počet dotykových informácií je možné načítať vo vlastníctve TouchCollection.Count. Dotykové informácie sa opakovane zobrazujú vo výpise for toľkokrát, koľkokrát sú získané. Pôvodne nie je problém slučkovať s foreachom, ale keďže v neskoršom vysvetlení použijeme index poľa (int index), slučkujeme ho s pre.

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

Teraz sa každá dotyková informácia získava ako štruktúra "TouchLocation". Ak sa slučkuje s for, možno ho získať pomocou "TouchCollection[index]". (Štruktúru "TouchLocation" môžete získať aj priamo v foreach.)

Nasledujúce štyri typy informácií je možné získať zo štruktúry "TouchLocation" a každá informácia sa zobrazí vo vzorke.

Keď ho skutočne spustíte, informácie o dotyku sa zobrazia tak, ako je uvedené nižšie. Keďže sa dotýkate tromi prstami, môžete vidieť tri dotyky. Mimochodom, ak sa dotknete piatimi prstami, uvidíte iba štyri. (Pretože maximálny počet akvizícií je 4)

図 4 :3 本の指でタッチしているところ
Obrázok 4: Dotyk tromi prstami

Program - Na čo si treba dávať pozor pri získavaní dotykových informácií 1 (index a ID)

Vyššie som spomenul, že existujú veci, ktoré treba mať na pamäti pri práci s dotykovými informáciami, ale prvým je "index" a "ID". Index jednoducho odkazuje na index poľa.

Myslím si, že je ľahšie pochopiť, ak to vyskúšate na skutočnom stroji, ako to vysvetliť písomne. Povedzme napríklad, že pracujete dvoma prstami, "ukazovákom" a "prostredníkom" a najskôr sa dotknete ukazovákom.

図 5 :人差し指でタッチ
Obrázok 5: Dotknite sa ukazovákom

Ako je znázornené na obrazovke, index bude "0". Potom sa ho dotknite prostredníkom.

図 6 :中指でタッチ
Obrázok 6: Dotyk prostredníkom

V tomto stave sa dotýkate dvoma prstami, takže sa zobrazia dve informácie. Index dotknutý prostredníkom je "1".

Zdvihnime tu ukazovák. Potom budú informácie o dotyku vyzerať takto.

図 7 :人差し指を放す
Obrázok 7: Uvoľnite ukazovák

Ako ste si už možno všimli, index informácií, ktorých sa dotýkate prostredníkom, je "0". Ak pri premiestňovaní spravujete znak podľa indexu, vyššie uvedená operácia povedie k nasledujúcim akciám.

・ Presuňte znak "A" ukazovákom

・ Presuňte znak "B" prostredníkom v tomto stave.

・ Uvoľnite ukazovák pri pohybe postavy prostredníkom

・ Postava ovládaná prostredníkom sa náhle prepne na "A"

Ďalším javom je, že ak opakovane uvoľníte alebo sa dotknete jedného z dvoch prstov, keď sa ich dotknete, kresliaci text informácií o prvom dotyku môže blikať. Je to preto, že druhý prst preruší ukazovák "0" v okamihu, keď sa ho dotknete alebo ho uvoľníte.

Ako je uvedené vyššie, index a poradie dotykových informácií pri viacdotykovom ovládaní sa nezhodujú s poradím, v akom sa ich niekto dotýka. Preto, ak chcete vykonávať akékoľvek operácie, nespravujte ich v indexe TouchCollection.

Čo by sa malo spravovať, je to, že štruktúra "TouchLocation" má vlastnosť "Id" a ID sa pri každom dotyku prepíše s novou hodnotou, ale vzťah medzi dotykovým bodom a ID je pri dotyku zaručený, takže ho budeme spravovať.

To samozrejme neznamená, že ho musíte spravovať pomocou ID a v niektorých prípadoch postačuje samotná dotyková poloha. Ak sa napríklad len dotknete tlačidla na obrazovke, môžete zistiť, či ste stlačili tlačidlo, kontrolou dotykovej polohy bez ohľadu na ID. Pri zahrnutí drag processingu sa však pozícia vždy mení, takže si myslím, že by mala byť stále určená ID.

Program - Čo treba mať na pamäti pri získavaní dotykových informácií 2 (počet získaných dotykových informácií)

Aj keď to nie je zahrnuté v programe článku, vzorka nakreslí reťazec "GetMaxTouchCount" v dolnej časti obrazovky a "maximálny počet dotykových informácií získaných súčasne". Toto v minulosti zobrazovalo maximálny počet dotykových informácií získaných metódou "TouchPanel.GetState", ale v tomto testovacom stroji je vlastnosť "TouchPanelCapabilities.MaximumTouchCount" 4, takže maximálna zobrazená hodnota by tu mala byť zvyčajne 4. Ak naň položíte päť prstov, bude to stále 4.

図 8 :5 本の指を置いたときの数値
Obrázok 8: Číslo piatich prstov

Urobme malý experiment. Skúste dotykový panel opakovať viacerými prstami pri vysokej rýchlosti. Závisí to od testovacieho stroja, ale počet môže prekročiť 4 skôr, ako si to uvedomíte.

図 9 :GetMaxTouchCount が 4 を超えている
Obrázok 9: GetMaxTouchCount je väčší ako 4

V skutočnosti dotykové informácie získané metódou "TouchPanel.GetState" nie sú dotykovými informáciami v okamihu volania metódy "TouchPanel.GetState", ale v okamihu, keď sa ich dotknete a v okamihu, keď ich uvoľníte z posledného načasovania aktualizácie, sa uloží do vyrovnávacej pamäte. Preto, aj keď je možné zistiť až štyri dotyky súčasne, opätovné dotyky toho istého prsta sa považujú za samostatný dotyk, takže je možné získať viac dotykových informácií ako TouchPanelCapabilities.MaximumTouchCount.

Preto aj keď je TouchPanelCapabilities.MaximumTouchCount 4, ak je počet prvkov poľa údajov súvisiacich s dotykom fixovaný na 4, v závislosti od spôsobu spracovania sa môže vyskytnúť chyba prekročenia indexu.

Mimochodom, v pomoci XNA Game Studio je maximálna hodnota vlastnosti TouchCollection.Count opísaná ako "8", takže ak chcete opraviť počet prvkov v poli, mali by ste nastaviť počet prvkov aspoň na 8. (Ak uvažujete o budúcich aktualizáciách verzií, možno budete chcieť zahrnúť ochrannú klauzulu, aby index neprešiel.)

Zhrnutie tejto vzorky

Tentokrát sme preskúmali rôzne parametre informácií získaných z multi-touch. Potvrdili sme tiež, že pri získavaní informácií o dotykovom paneli je potrebné mať na pamäti niekoľko bodov. Na základe týchto poznatkov by som chcel vysvetliť vzorku, ktorá skutočne používa viacdotykové ovládanie.