Dotykové interakce při vývoji her pro Windows Phone 7 část 2 Vícedotykové ovládání

Stránky aktualizovány :
Datum vytvoření stránky :

Programování! - 2.Zkuste multi-touch

O této ukázce

Zde bych rád vysvětlil program pro realizaci vícedotykového vstupu. Ve Windows Phone 7 je vícedotykové ovládání prostřednictvím dotykového panelu jednou z nejdůležitějších položek pro vstup uživatele. Je to proto, že na rozdíl od Windows a Xbox 360 je hlavním vstupním rozhraním "dotykový panel". Mohou existovat telefony Windows s klávesnicí, ale samozřejmě je ne vždy mají. Aby tedy hra fungovala na jakémkoli Windows Phone, musí být dotyková.

Pokud omezíte dotykový panel pouze na "jeden dotyk", typy her, které lze vytvořit, budou nevyhnutelně omezeny, pokud jde o vytváření her. Představte si kapesní herní konzoli (můžete ji nechat nehybnou). Většina herních konzolí vyžaduje, abyste drželi herní ovladač (nebo skutečnou konzoli) oběma rukama a stiskli několik tlačítek současně.

Windows Phone 7 nemá tolik tlačítek jako herní ovladače a nemusí mít nutně klávesnici. Proto mohou být virtuální klávesy a tlačítka umístěny na obrazovce a při jejich stisknutí je to nepohodlné, protože je nelze stisknout současně pouze jedním dotykem.

Samozřejmě, kromě výše uvedeného příkladu virtuálního tlačítka, je multi-touch nezbytný pro hry, kde více lidí ovládá jednu obrazovku, například "sevření a roztažení (přesunutí dvou bodů blíže nebo dále od sebe)", které je běžné v multi-touch.

Mimochodem, úvod je dlouhý, ale v této ukázce bych chtěl získat vícedotykové informace pomocí třídy věnované dotykovým panelům. Je zábavné vytvořit vzorek, který lze najednou hrát s multi-touch, ale nejprve bych chtěl zjistit, jaké informace lze získat pomocí multi-touch. Existují určité návyky, takže tím, že je znáte jako první, můžete zkrátit čas strávený zkoumáním příčiny, například když to nefunguje dobře při programování později.

Cíle tohoto ukázkového programu

Zobrazte a potvrďte informace při vícedotykovém ovládání.

図 1 :タッチしたときにタッチ情報がテキストで表示される
Obrázek 1: Informace o dotyku se při dotyku zobrazí jako text

Program - deklarování polí

Pole musí být označena jako Struktura TouchPanelCapabilities a Struktura TouchCollection.

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

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

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

"Struktura TouchPanelCapabilities" je struktura, která může mít funkce samotného dotykového panelu jako parametry. Používá se ke kontrole, zda lze dotykový panel použít během aktualizace.

Struktura TouchCollection obsahuje seznam informací o aktuálně dotčeném stavu. Pokud je detekováno více dotyků, lze načíst více "struktur TouchLocation". Více o tom později.

Program - Načítání písem

Před vykreslením textu na obrazovce přidejte definici písma do projektu obsahu a načtěte ji pomocí metody Game.LoadContent. To přímo nesouvisí s dotykovými panely, takže vynechám podrobné vysvětlení.

図 2 :コンテンツプロジェクトに「Font.spritefont」を追加しておく
Obrázek 2: Přidání "Font.spritefont" do projektu obsahu

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

Program - Získání informací z dotykového panelu

Získejte informace o dotykovém panelu uvnitř metody Game.Update.

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

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

Můžete volat metodu "TouchPanel.GetCapabilities" a získat informace o funkci dotykového panelu. Existují dva typy informací, které lze získat: "Lze dotykový panel použít?" a "Maximální počet dotykových bodů, které lze získat dotykovým panelem". Ani jeden z nich se během hry nemění, takže si myslím, že není problém, pokud si ho pořídíte metodou Game.Initialize, ale v budoucnu se objeví zařízení, která mohou odstranit dotykový panel (dotykový panel, který lze připojit k USB nebo skutečným zařízením jiným než Windows Phone) a je popsáno v metodě Update.

Také není třeba kontrolovat, zda lze dotykový panel použít, protože jej lze vždy použít v systému Windows Phone 7, ale při sdílení kódu se systémem Windows a Xbox 360 nejsou tyto hardwarové vstupní rozhraní vyžadovány a je třeba je zkontrolovat.

Pokud můžete potvrdit, že dotykový panel je k dispozici ve vlastnosti "TouchPanelCapabilities.IsConnected", metoda "TouchPanel.GetState" získá aktuální stav dotyku.

Původně se některé operace zpracovávají až po získání dotykových informací, ale v této ukázce se informace zobrazují pouze, takže v metodě Game.Update se neprovádí žádné další zpracování.

Program - Získejte maximální počet kontaktních bodů, které můžete získat

Maximální počet dotykových bodů, které lze načíst, je zhruba pevný, takže není často nutné je načítat během hry, ale můžete získat maximální počet dotykových bodů, které lze načíst z vlastnosti TouchPanelCapabilities.MaximumTouchCount. Pokud je například vlastnost MaximumTouchCount "4", nemůžete získat informace o páté pozici dotykem dotykového panelu pěti prsty.

Počet akvizic pro smartphone "HTC 7 Trophy" použitý v tomto vzorku byl "4". (Mimochodem, XNA Game Studio 4.0 je definováno tak, aby vždy vracelo 4.) Specifikace Windows Phone 7 říká, že je to více než 4 body, takže nevrací méně než 4.)

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

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

Program - Získání informací o dotykovém ovládání

Načtená struktura TouchCollection obsahuje více informací o dotyku. Pokud se například dotknete dvěma prsty, obvykle obsahuje dva dotyky.

Počet informací o dotyku lze načíst ve vlastnosti TouchCollection.Count. Informace o dotyku se opakovaně zobrazují ve příkazu for tolikrát, kolikrát jsou získány. Původně není problém opakovat s foreach, ale protože v pozdějším vysvětlení použijeme index pole (int index), smyčka s 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);
}

Nyní jsou všechny informace o dotyku získány jako struktura "TouchLocation". Pokud je ve smyčce s for, lze ji získat pomocí "TouchCollection[index]". (Můžete také získat strukturu "TouchLocation" přímo v foreach.)

Následující čtyři typy informací lze získat ze struktury "TouchLocation" a každá informace je zobrazena v ukázce.

Když jej skutečně spustíte, zobrazí se informace o dotyku, jak je znázorněno níže. Vzhledem k tomu, že se dotýkáte třemi prsty, můžete vidět tři dotyky. Mimochodem, pokud se dotknete pěti prsty, uvidíte jen čtyři. (Protože maximální počet akvizic je 4)

図 4 :3 本の指でタッチしているところ
Obrázek 4: Dotyk třemi prsty

Program - Na co si dát pozor při načítání dotykových informací 1 (rejstřík a ID)

Výše jsem zmínil, že existují věci, které je třeba mít na paměti při práci s dotykovými informacemi, ale první je "index" a "ID". Index jednoduše odkazuje na index pole.

Myslím, že je snazší to pochopit, když to zkusíte na skutečném stroji, než to vysvětlit písemně. Řekněme například, že pracujete dvěma prsty, "ukazováčkem" a "prostředníčkem", a nejprve se dotknete ukazováčkem.

図 5 :人差し指でタッチ
Obrázek 5: Dotyk ukazováčkem

Jak je znázorněno na obrazovce, index bude "0". Pak se ho dotkněte prostředníčkem.

図 6 :中指でタッチ
Obrázek 6: Dotyk prostředníčku

V tomto stavu se dotýkáte dvěma prsty, takže se zobrazí dvě informace. Index, kterého se dotknete prostředníčkem, je "1".

Zvedneme zde ukazováček. Informace o dotyku budou vypadat takto.

図 7 :人差し指を放す
Obrázek 7: Uvolnění ukazováčku

Jak jste si možná všimli, index informací, kterých se dotýkáte prostředníčkem, je "0". Pokud znak při přesunu spravujete podle rejstříku, výše uvedená operace povede k následujícím akcím.

・ Přesuňte znak "A" ukazováčkem

・ Přesuňte znak "B" prostředníčkem v tomto stavu.

・ Uvolněte ukazováček při pohybu znaku prostředníčkem

・ Znak ovládaný prostředníčkem se náhle přepne do polohy "A"

Dalším jevem je, že pokud opakovaně uvolníte nebo se dotknete jednoho ze dvou prstů, zatímco se jich dotýkáte, může text kresby informace o prvním dotyku blikat. Je to proto, že druhý prst přeruší index "0" v okamžiku, kdy se ho dotknete nebo uvolníte.

Jak bylo uvedeno výše, index a pořadí informací o dotyku při vícedotykovém ovládání neodpovídají pořadí, ve kterém se jich dotýkáte. Pokud tedy chcete provádět nějaké operace, nespravujte je v indexu TouchCollection.

Co by mělo být spravováno, je, že struktura "TouchLocation" má vlastnost "Id" a Id je přepsáno novou hodnotou pokaždé, když se dotknete, ale vztah mezi dotykovým bodem a ID je zaručen při dotyku, takže jej budeme spravovat.

Samozřejmě to neznamená, že to musíte řídit pomocí ID a v některých případech stačí samotná dotyková poloha. Pokud se například dotknete tlačítka na obrazovce, můžete zjistit, že jste stiskli tlačítko, kontrolou polohy dotyku bez ohledu na ID. Při zahrnutí zpracování tahu se však pozice vždy mění, takže si myslím, že by měla být stále určena ID.

Program - Co je třeba mít na paměti při získávání dotykových informací 2 (počet získaných dotykových informací)

Ačkoli to není součástí programu článku, ukázka kreslí řetězec "GetMaxTouchCount" v dolní části obrazovky a "maximální počet dotykových informací získaných současně". V minulosti se zobrazil maximální počet dotykových informací získaných metodou "TouchPanel.GetState", ale v tomto testovacím počítači je vlastnost "TouchPanelCapabilities.MaximumTouchCount" 4, takže maximální hodnota zde zobrazená by měla být obvykle 4. Pokud na něj dáte pět prstů, bude to stále 4.

図 8 :5 本の指を置いたときの数値
Obrázek 8: Číslo pěti prsty

Udělejme malý experiment. Zkuste dotykový panel opakovat více prsty při vysoké rychlosti. Záleží na testovacím stroji, ale číslo může překročit 4, než se nadějete.

図 9 :GetMaxTouchCount が 4 を超えている
Obrázek 9: GetMaxTouchCount je větší než 4

Ve skutečnosti dotykové informace získané metodou "TouchPanel.GetState" nejsou dotykové informace v okamžiku volání metody "TouchPanel.GetState", ale v okamžiku, kdy se ho dotknete a v okamžiku, kdy jej uvolníte z posledního načasování aktualizace, jsou uloženy do mezipaměti. Proto, i když lze detekovat až čtyři dotyky současně, opětovné dotykování stejného prstu je považováno za samostatný dotyk, takže lze získat více informací o dotyku než TouchPanelCapabilities.MaximumTouchCount.

Proto i v případě, že TouchPanelCapabilities.MaximumTouchCount je 4, pokud je počet prvků pole dotykových dat pevně stanoven 4, může v závislosti na metodě zpracování dojít k chybě nadlimitního využití indexu.

Mimochodem, v nápovědě XNA Game Studio je maximální hodnota vlastnosti TouchCollection.Count popsána jako "8", takže pokud chcete opravit počet prvků v poli, měli byste nastavit počet prvků alespoň na 8. (Pokud přemýšlíte o budoucích upgradech verzí, můžete zahrnout ochrannou klauzuli, aby index nepřecházel.)

Shrnutí této ukázky

Tentokrát jsme zkoumali různé parametry pro informace získané z multi-touch. Také jsme potvrdili, že při získávání informací z dotykového panelu je třeba mít na paměti některé body. Na základě těchto znalostí bych rád vysvětlil vzorek, který skutečně používá multi-touch.