Interakcije na dotik pri razvoju igre za Windows Phone 7 Part 2 Multitouch
Programiranje! - 2.Poskusite z več dotiki
O tem vzorcu
Tukaj bi rad razložil program za uresničitv več-touch vhoda. V telefonu Windows Phone 7 je vnos z več dotiki prek plošče na dotik eden najpomembnejših elementov za vnos uporabnika. To je zato, ker je za razliko od windows in Xbox 360 glavni vhodni vmesnik "touch panel". Morda so telefoni s sistemom Windows s tipkovnicami, seveda pa jih nimajo vedno. Torej, da bi igra delovala na kateri koli Windows Phone, mora biti na dotik sposoben.
Če ploščo na dotik omejite samo na »en dotik«, bodo vrste iger, ki jih je mogoče igrati, pri izdelavi iger nedvomno omejene. Pomislite na ročno igralno konzolo (lahko jo pustite mirujoča). Večina igralnih konzol zahteva, da upravljalnik igre (ali dejansko konzolo) držite z obema rokama in hkrati pritisnete več gumbov.
Windows Phone 7 nima toliko gumbov kot krmilniki iger in ni nujno, da ima tipkovnico. Zato se na zaslon lahko postavijo virtualne tipke in gumbi, pri pritisku pa je to neprijetno, ker jih ni mogoče pritisniti hkrati samo z enim dotikom.
Seveda je poleg zgornjega primera virtualnega gumba več dotikov potrebno tudi za igre, kjer več ljudi upravlja en zaslon, na primer "ščipni in raztegni (premakni dve točki bližje ali dlje narazen)", ki je pogosta pri več dotikih.
Mimogrede, uvod je dolg, vendar bi v tem vzorcu želel pridobiti več dotikov informacije z uporabo razreda, namenjenega plošč na dotik. Zabavno je ustvariti vzorec, ki ga je mogoče igrati z več dotiki nenadoma, najprej pa bi rad izvedel, kakšne informacije je mogoče dobiti z več dotiki. Obstajajo nekatere navade, tako da jih najprej poznate, lahko zmanjšate čas, porabljen za preiskovanje vzroka, na primer, ko kasneje ne deluje dobro v programiranje.
Cilji tega vzorčne programa
Prikažite in potrdite informacije, ko se izvede več dotikov.
Slika 1: Podatki o dotiku se ob dotiku prikažejo kot besedilo
Program – deklariranje polj
Polja morajo biti označena z Oznako strukture za touchPanelCapabilities in Strukturo za na dotikCollection.
<summary>
スプライトでテキストを描画するためのフォント
</summary>
SpriteFont font;
<summary>
タッチパネルの機能情報
</summary>
TouchPanelCapabilities capabilities;
<summary>
取得したタッチ情報の一覧
</summary>
TouchCollection touches;
Struktura »TouchPanelCapabilities« je struktura, ki ima lahko funkcije same plošče na dotik kot parametre. Uporablja se za preverjanje, ali je ploščo na dotik mogoče uporabiti med posodabljanjem.
Struktura TouchCollection vsebuje seznam informacij o trenutno dotikanem stanju. Če zaznate več dotikov, je mogoče pridobiti več »struktur touchLocation«. Več o tem kasneje.
Program – Nalaganje pisav
Preden na zaslonu narišete besedilo, dodajte definicijo pisave v projekt vsebine in ga naložite z metodo Game.LoadContent. To ni neposredno povezano z dotiknimi ploščami, zato bom iznevedla podrobno razlago.
Slika 2: Dodajte »Font.spritefont« v svoj vsebinski projekt
// フォントをコンテンツパイプラインから読み込む
font = Content.Load<SpriteFont>("Font");
Program – Preusmite informacije o plošči na dotik
Poiščite informacije o plošči na dotik v načinu Game.Update.
// タッチパネルの機能情報を取得
capabilities = TouchPanel.GetCapabilities();
// タッチパネルが使用可能であるかチェック
if (capabilities.IsConnected)
{
// 現在のタッチパネルの入力情報を取得
touches = TouchPanel.GetState();
}
Če želite dobiti informacije o funkciji na dotik, lahko pokličete metodo »TouchPanel.GetCapabilities«. Obstajata dve vrsti informacij, ki jih je mogoče pridobiti: "Ali je mogoče uporabiti ploščo na dotik?" in "Največje število dotiknih točk, ki jih je mogoče pridobiti s ploščo na dotik." Nobena od njih se ne spremeni med igro, tako da mislim, da ni nobenega problema, če ga dobiš na igro.Inicializirajte metodo, vendar v prihodnosti se pojavijo naprave, ki lahko odstranijo ploščo na dotik (na dotik ploščo, ki je mogoče povezati z USB ali dejanske naprave, ki niso Windows Phone), in je opisano v metodi Posodobitev.
Prav tako ni treba preveriti, ali je ploščo na dotik mogoče uporabiti, ker se lahko vedno uporablja v telefonu Windows Phone 7, vendar pri skupni rabi kode s sistemoma Windows in Xbox 360 ta strojna oprema ni potrebna vnosnih vmesnikov in jo je treba preveriti.
Če potrdite, da je na dotik na voljo lastnost »TouchPanelCapabilities.IsConnected«, metoda »TouchPanel.GetState« dobi trenutno stanje na dotik.
Prvotno se nekatere operacijske obdelave izvedejo po pridobivanju informacij o dotiku, vendar so v tem vzorcu prikazane le informacije, zato v metodi Game.Update ni opravljena nobena nadaljnja obdelava.
Program - Dobi največje število dotikov, ki jih lahko dobiš
Največje število touchpointov, ki jih je mogoče pridobiti, je približno fiksno, zato jih ni pogosto potrebno pridobiti med igro, vendar lahko pridobite največje število touchpointov, ki jih je mogoče pridobiti iz lastnosti TouchPanelCapabilities.MaximumTouchCount. Če je na primer lastnost MaximumTouchCount »4«, informacij o petem položaju ne morete dobiti tako, da se dotaknete plošče na dotik s petimi prsti.
Število prevzemov za pametni telefon "HTC 7 Trophy", uporabljenega v tem vzorcu, je bilo "4". (Mimogrede, XNA Game Studio 4.0 je definiran, da vedno vrne 4.) Specifikacija za Windows Phone 7 pravi, da je več kot 4 točke, zato se ne vrne manj kot 4.)
// タッチ可能な最大数を表示
spriteBatch.DrawString(font,
"MaximumTouchCount : " +
capabilities.MaximumTouchCount,
new Vector2(20, 50),
Color.LightGreen);
Slika 3: TouchPanelCapabilities.MaximumTouchCount Property Retrieval Count
Program – Preusmite informacije o dotiku
Pridobljena struktura TouchCollection vsebuje več informacij o dotiku. Če se na primer dotaknete dveh prstov, običajno vsebuje dva dotika.
Število informacij na dotik je mogoče pridobiti v lastnosti TouchCollection.Count. Podatki o dotiku so večkrat prikazani v izjavi za izjavo tolikokrat, kot so pridobljeni. Prvotno ni nobenega problema za zanke s predložki, ker pa bomo v poznejši razlagi uporabili indeks matrike (int indeks), ga zankamo z za.
// タッチ情報の数だけループする
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);
}
Zdaj je vsaka informacija o dotiku pridobljena kot struktura »TouchLocation«. Če zahaja z za, se lahko pridobi z "TouchCollection[index]". (Strukturo »TouchLocation« lahko dobite tudi neposredno v predpostavkah.)
Naslednje štiri vrste informacij lahko dobite iz strukture »TouchLocation« in vsaka informacija je prikazana v vzorcu.
Ko ga dejansko zaženete, se podatki o dotiku prikažejo, kot je prikazano spodaj. Ker se dotikate s tremi prsti, lahko vidite tri dotike. Mimogrede, če se dotakneš petih prstov, boš videl samo do štiri. (Ker je največje število prevzemov 4)
Slika 4: Dotikanje s tremi prsti
Program - Stvari, ki jih je treba paziti pri pridobivanju informacij o dotiku 1 (indeks in ID)
Zgoraj sem omenil, da obstajajo stvari, ki jih je treba imeti v mislih, ko se ukvarjajo z informacijami o dotiku, vendar je prvi "indeks" in "ID". Indeks se preprosto nanaša na indeks polja.
Mislim, da je lažje razumeti, če ga poskusite na dejanski stroj, kot razložiti v pisni obliki. Recimo, da delujete z dvema prstoma, »kazalcem« in »srednjim prstom« in se najprej dotaknite kazalca.
Slika 5: Dotik s kazalcem
Kot je prikazano na zaslonu, bo indeks "0". Nato se ga dotakni s srednjim prstom.
Slika 6: Dotik srednjega prsta
V tem stanju se dotikate z dvema prstoma, tako da sta prikazana dva kosa informacij. Kazalo, ki se ga dotaknemo s srednjim prstom, je "1".
Dvignimo kazalec. Nato bodo informacije o dotiku videti kot naslednje.
Slika 7: Sprostite kazalec
Kot ste morda že opazili, je indeks informacij, ki se jih dotikate s srednjim prstom, "0". Če upravljate znak po indeksu, ko ga premaknete, bo zgornji postopek vodil do naslednjih dejanj.
- Premaknite znak "A" s kazalcem
↓
- Premaknite znak "B" s srednjim prstom v tem stanju.
↓
- Spustite kazalec med premikanjem znaka s srednjim prstom
↓
- Znak, ki ga nadzoruje srednji prst, nenadoma preklopi na "A"
Drug pojav je, da če med dotikom večkrat spustite ali se dotaknete enega od dveh prstov, lahko risba besedila prvih informacij o dotiku utripa. To je zato, ker drugi prst prekine indeks "0" v trenutku, ko se ga dotaknete ali spustite.
Kot je navedeno zgoraj, indeks in vrstni red podatkov o dotiku, ko se več dotikov ne ujemata z vrstnim redom, po katerem se jih dotikamo. Če želite izvesti operacije, jih ne upravljajte v indeksu TouchCollection.
Upravljati je treba, da ima struktura »TouchLocation« lastnost »ID«, ID pa je vsakič, ko se ga dotaknete, prepisan z novo vrednostjo, vendar je med dotikom zagotovljen odnos med dotikom in ID-jem, zato ga bomo upravljali.
Seveda to ne pomeni, da ga morate upravljati z ID- jem, v nekaterih primerih pa zadostuje samo položaj dotika. Če se na primer samo dotaknete gumba na zaslonu, lahko določite, da ste pritisnil gumb tako, da preverite položaj na dotik ne glede na ID. Vendar, ko vključuje obdelavo povlecite, položaj vedno spremeni, tako da mislim, da bi bilo treba še vedno določiti Z ID.
Program - Stvari, ki jih je treba imeti v mislih pri pridobivanju informacij o dotiku 2 (število pridobljenih informacij na dotik)
Čeprav ni vključen v program članka, vzorec nariše niz "GetMaxTouchCount" na dnu zaslona in "največje število informacij na dotik, pridobljenih hkrati". To je prikazalo največje število informacij na dotik, pridobljenih z metodo »TouchPanel.GetState« v preteklosti, vendar je v tem preskusnem stroju lastnost »TouchPanelCapabilities.MaximumTouchCount« 4, zato mora biti največja vrednost, prikazana tukaj, običajno 4. Če natakneš pet prstov na to, bo še vedno 4.
Slika 8: Pet prstna številka
Poskusiva malo. Poskusite ponoviti ploščo na dotik z več prsti pri visoki hitrosti. To je odvisno od preskusnega stroja, vendar lahko številka presega 4, preden ga poznate.
Slika 9: GetMaxTouchCount je večji od 4
Informacije o dotiku, pridobljene z metodo »TouchPanel.GetState« v trenutku klicanja metode »TouchPanel.GetState«, niso informacije o dotiku, temveč trenutek, ko se ga dotaknete, in trenutek, ko ga izpustite iz zadnjega časovnega razporeda posodobitev, predpomnijo. Kljub temu, da je mogoče zaznati do štiri dotike hkrati, se ponovno dotikanje istega prsta obravnava kot ločen dotik, zato je mogoče pridobiti več informacij o dotiku kot TouchPanelCapabilities.MaximumTouchCount.
Zato, tudi če TouchPanelCapabilities.MaximumTouchCount je 4, če je število elementov polja podatkov, povezanih z dotikom, fiksno za 4, lahko pride do napake pri overage indeksu, odvisno od načina obdelave.
Mimogrede, v pomoč XNA Game Studio, največja vrednost touchCollection.Count lastnost je opisana kot "8", tako da če želite popraviti število elementov v matrici, morate nastaviti število elementov na vsaj 8. (Če pomislite na prihodnje nadgradnje različic, boste morda želeli vključiti klavzulo o straži, tako da indeks ne bo šel čez.)
Povzetek tega vzorca
Tokrat smo preučili različne parametre za informacije, pridobljene z več dotiki. Potrdili smo tudi, da pri pridobivanju informacij o plošči na dotik obstajajo nekatere točke, ki jih je treba imeti v mislih. Na podlagi tega znanja bi rad razložil vzorec, ki dejansko uporablja več dotikov.