Érintéses műveletek a Windows Phone 7 2. részének többérintéses játékfejlesztésében

Oldal frissítve :
Oldal létrehozásának dátuma :

Programozás! - 2.Próbáld ki a multi-touch-ot

A minta ismertetése

Itt szeretném elmagyarázni a multi-touch bemenet megvalósításának programját. A Windows Phone 7 rendszerben az érintőképernyőn keresztüli többérintéses bevitel a felhasználói bevitel egyik legfontosabb eleme. Ennek az az oka, hogy a Windowstól és az Xbox 360-tól eltérően a fő bemeneti felület az "érintőpanel". Lehet, hogy vannak Windows telefonok billentyűzettel, de természetesen nem mindig rendelkeznek velük. Tehát ahhoz, hogy a játék bármilyen Windows Phone-on működjön, megérinthetőnek kell lennie.

Ha az érintőpanelt csak az "egyérintéses" funkcióra korlátozza, akkor az elkészíthető játékok típusai elkerülhetetlenül korlátozottak lesznek, amikor játékkészítésről van szó. Gondolj egy kézi játékkonzolra (helyben hagyhatod). A legtöbb játékkonzol megköveteli, hogy mindkét kezével tartsa a játékvezérlőt (vagy a tényleges konzolt), és egyszerre több gombot nyomjon meg.

A Windows Phone 7 nem rendelkezik annyi gombbal, mint a játékvezérlők, és nem feltétlenül rendelkezik billentyűzettel. Ezért virtuális gombok és gombok helyezhetők el a képernyőn, és megnyomásukkor kényelmetlen, mert nem lehet egyszerre egyetlen érintéssel megnyomni őket.

Természetesen a fenti virtuális gombos példa mellett a multi-touch olyan játékokhoz is szükséges, ahol több ember működtet egy képernyőt, mint például a "csippentés és nyújtás (két pont közelebb vagy távolabb mozgatása)" a multi-touch-ban gyakori.

Egyébként a bevezetés hosszú, de ebben a mintában többérintéses információkat szeretnék szerezni az érintőpaneleknek szentelt osztály segítségével. Jó móka olyan mintát készíteni, amelyet hirtelen multi-touch-szal lehet lejátszani, de először szeretném megtudni, hogy milyen információkat lehet szerezni a multi-touch segítségével. Vannak bizonyos szokások, így ha először ismeri őket, csökkentheti az ok kivizsgálására fordított időt, például amikor később nem működik jól a programozásban.

A mintaprogram céljai

Jelenítse meg és erősítse meg az információkat, amikor többérintéses vezérlést hajt végre.

図 1 :タッチしたときにタッチ情報がテキストで表示される
1. ábra: Az érintési információk szövegként jelennek meg, amikor megérintik őket

Program – Mezők deklarálása

A mezőket TouchPanelCapabilities Structure és TouchCollection Structure címkével kell ellátni.

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

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

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

A "TouchPanelCapabilities struktúra" egy olyan struktúra, amely maga az érintőpanel funkciói lehetnek paraméterekként. Annak ellenőrzésére szolgál, hogy az érintőpanel használható-e a frissítés során.

A TouchCollection struktúra az aktuálisan megérintett állapotra vonatkozó információk listáját tartalmazza. Ha több érintést észlel, több "TouchLocation struktúra" is lekérhető. Többet erről később.

Program - Betűtípusok betöltése

Mielőtt szöveget rajzolna a képernyőre, adja hozzá a betűtípus-definíciót a tartalomprojekthez, és töltse be a Game.LoadContent módszerrel. Ez nem kapcsolódik közvetlenül az érintőpanelekhez, ezért kihagyom a részletes magyarázatot.

図 2 :コンテンツプロジェクトに「Font.spritefont」を追加しておく
2. ábra: Adja hozzá a "Font.spritefont" fájlt a tartalomprojekthez

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

Program - Érintőpanel-információk lekérése

Szerezze be az érintőpanel adatait a Game.Update módszeren belül.

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

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

Hívhatja a "TouchPanel.GetCapabilities" metódust az érintőpanel funkcióinformációinak megszerzéséhez. Kétféle információ szerezhető be: "Használható-e az érintőpanel?" és "Az érintőpanel által megszerezhető érintési pontok maximális száma". Egyikük sem változik a játék során, így azt hiszem, nincs probléma, ha a Game.Initialize módszer szerint kapja meg, de a jövőben megjelennek azok az eszközök, amelyek eltávolíthatják az érintőpanelt (érintőképernyő, amely USB-hez vagy a Windows Phone-tól eltérő tényleges eszközökhöz csatlakoztatható), és ezt a Frissítési módszer írja le.

Ezenkívül nem kell ellenőrizni, hogy az érintőpanel használható-e, mert mindig használható Windows Phone 7 rendszeren, de amikor kódot oszt meg a Windows és az Xbox 360 rendszerrel, ezek a hardverek nem szükségesek bemeneti interfészekhez, és ellenőrizni kell őket.

Ha meg tudja erősíteni, hogy az érintőpanel elérhető a "TouchPanelCapabilities.IsConnected" tulajdonságban, a "TouchPanel.GetState" metódus az aktuális érintési állapotot kapja meg.

Eredetileg néhány művelet feldolgozása az érintési információk megszerzése után történik, de ebben a mintában az információk csak akkor jelennek meg, így a Game.Update módszerben nem történik további feldolgozás.

Program - Szerezd meg a lehető legtöbb érintkezési pontot

A lekérhető érintkezési pontok maximális száma nagyjából rögzített, így gyakran nem szükséges lekérni őket a játék során, de a TouchPanelCapabilities.MaximumTouchCount tulajdonságból lekérhető érintési pontok maximális számát megkaphatja. Ha például a MaximumTouchCount tulajdonság értéke "4", akkor az ötödik pozíció adatai nem kaphatók meg, ha öt ujjal megérinti az érintőpanelt.

Az ebben a mintában használt "HTC 7 Trophy" okostelefon felvásárlásainak száma "4" volt. (Egyébként az XNA Game Studio 4.0 úgy van definiálva, hogy mindig 4-et adjon vissza.) A Windows Phone 7 specifikációja szerint több mint 4 pont, így nem ad vissza 4-nél kevesebbet.)

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

図 3 :TouchPanelCapabilities.MaximumTouchCount プロパティの取得数
3. ábra: TouchPanelCapabilities.MaximumTouchCount tulajdonság lekérési száma

Program - Érintéses információk lekérése

A lekért TouchCollection struktúra több érintési információt tartalmaz. Például, ha két ujjal érinti, általában két érintést tartalmaz.

Az érintési adatok száma a TouchCollection.Count tulajdonságban kérhető le. Az érintési információk többször is megjelennek a for utasításban, ahányszor beszerezték őket. Eredetileg nincs probléma a foreach-szal való hurkolással, de mivel a későbbi magyarázatban a tömbindexet (int index) fogjuk használni, a for-val hurkoljuk.

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

Mostantól minden érintési információ "TouchLocation" struktúraként lesz lekérve. Ha a for-val hurkolódik, akkor a "TouchCollection[index]" segítségével szerezhető be. (A "TouchLocation" struktúrát közvetlenül a foreach-ban is megkaphatja.)

A következő négy információtípus a "TouchLocation" struktúrából nyerhető, és minden információ megjelenik a mintában.

Amikor ténylegesen futtatja, az érintési információk az alábbiak szerint jelennek meg. Mivel három ujjal érint, három érintést láthat. Mellesleg, ha öt ujjal érintkezik, csak négyet fog látni. (Mivel az akvizíciók maximális száma 4)

図 4 :3 本の指でタッチしているところ
4. ábra: Érintés három ujjal

Program – Az érintéses információk lekérésekor figyelembe veendő dolgok 1 (index és azonosító)

Fentebb említettem, hogy vannak dolgok, amelyeket szem előtt kell tartani, amikor érintési információkkal foglalkozunk, de az első az "index" és az "azonosító". Az index egyszerűen egy tömbindexre utal.

Azt hiszem, könnyebb megérteni, ha egy tényleges gépen próbálod ki, mint írásban elmagyarázni. Tegyük fel például, hogy két ujjal operál, "mutatóujjal" és "középső ujjal", és először a mutatóujjával érinti.

図 5 :人差し指でタッチ
5. ábra: Érintse meg a mutatóujját

Amint az a képernyőn látható, az index "0" lesz. Ezután érintse meg a középső ujjával.

図 6 :中指でタッチ
6. ábra: Középső ujj érintése

Ebben az állapotban két ujjal érintkezik, így két információ jelenik meg. A középső ujjal megérintett index "1".

Emeljük ide a mutatóujjunkat. Ezután az érintési információk a következőképpen fognak kinézni.

図 7 :人差し指を放す
7. ábra: Engedje el a mutatóujját

Amint azt már észrevehette, a középső ujjával megérintett információk indexe "0". Ha a karaktert index alapján kezeli, amikor áthelyezi, a fenti művelet a következő műveletekhez vezet.

・ Mozgassa az "A" karaktert a mutatóujjával

・ Mozgassa a "B" karaktert a középső ujjával ebben az állapotban.

・ Engedje el a mutatóujját, miközben a középső ujjával mozgatja a karaktert

・ A középső ujj által vezérelt karakter hirtelen "A" -ra vált

Egy másik jelenség az, hogy ha ismételten elengedi vagy megérinti a két ujj egyikét, miközben megérinti őket, az első érintési információ rajzszövege villoghat. Ennek az az oka, hogy a második ujj megszakítja a "0" indexet abban a pillanatban, amikor megérinti vagy elengedi.

Mint fentebb említettük, az index és az érintési információk sorrendje a multi-touch esetén nem egyezik meg az érintés sorrendjével. Ezért ha bármilyen műveletet szeretne végrehajtani, ne kezelje azokat a TouchCollection indexben.

Amit kezelni kell, az az, hogy a "TouchLocation" struktúra rendelkezik egy "Id" tulajdonsággal, és az Id minden alkalommal új értékkel lesz átírva, amikor megérinti, de az érintési pont és az azonosító közötti kapcsolat garantált az érintés során, így kezelni fogjuk.

Természetesen ez nem jelenti azt, hogy azonosítóval kell kezelnie, és bizonyos esetekben az érintési pozíció önmagában elegendő. Ha például csak megérint egy gombot a képernyőn, az azonosítótól függetlenül ellenőrizheti, hogy megnyomott-e egy gombot. A húzásfeldolgozás során azonban a pozíció mindig változik, ezért úgy gondolom, hogy ezt továbbra is az azonosítónak kell meghatároznia.

Program – Az érintési információk beszerzésekor szem előtt tartandó dolgok 2 (a megszerzett érintési információk száma)

Bár a cikk programja nem szerepel, a minta a képernyő alján a "GetMaxTouchCount" karakterláncot és az "egyidejűleg megszerzett érintési információk maximális számát" rajzolja. Ez a "TouchPanel.GetState" metódus által a múltban megszerzett érintési információk maximális számát jelenítette meg, de ebben a tesztgépben a "TouchPanelCapabilities.MaximumTouchCount" tulajdonság 4, így az itt megjelenített maximális értéknek általában 4-nek kell lennie. Ha öt ujját ráhelyezi, akkor is 4 lesz.

図 8 :5 本の指を置いたときの数値
8. ábra: Ötujjas szám

Tegyünk egy kis kísérletet. Próbálja meg megismételni az érintőpanelt több ujjal, nagy sebességgel. Ez a tesztgéptől függ, de a szám meghaladhatja a 4-et, mielőtt észrevenné.

図 9 :GetMaxTouchCount が 4 を超えている
9. ábra: A GetMaxTouchCount nagyobb, mint 4

Valójában a "TouchPanel.GetState" metódus által megszerzett érintési információk nem a "TouchPanel.GetState" metódus hívásának pillanatában lévő érintési információk, hanem abban a pillanatban, amikor megérinti, és abban a pillanatban, amikor felszabadítja az utolsó frissítés időzítéséből, gyorsítótárazva van. Ezért annak ellenére, hogy egyszerre legfeljebb négy érintés észlelhető, ugyanazon ujj újbóli megérintése külön érintésként van kezelve, így több érintési információ szerezhető be, mint a TouchPanelCapabilities.MaximumTouchCount.

Ezért még akkor is, ha a TouchPanelCapabilities.MaximumTouchCount értéke 4, ha az érintéssel kapcsolatos adatok tömbelemeinek száma 4-gyel van rögzítve, a feldolgozási módtól függően indextúllépési hiba léphet fel.

Egyébként, az XNA Game Studio segítségével a TouchCollection.Count tulajdonság maximális értéke "8" -ként van leírva, így ha a tömbben lévő elemek számát szeretné rögzíteni, akkor az elemek számát legalább 8-ra kell állítania. (Ha a jövőbeli verziófrissítésekre gondolsz, érdemes lehet egy őrzáradékot is beilleszteni, hogy az index ne menjen át.)

A minta összefoglalása

Ezúttal a multi-touch-ból nyert információk különböző paramétereit vizsgáltuk. Azt is megerősítettük, hogy van néhány szempont, amelyet szem előtt kell tartani az érintőpanel-információk beszerzésekor. Ezen ismeretek alapján szeretnék elmagyarázni egy olyan mintát, amely valójában multi-touch-ot használ.