Skārienu mijiedarbība spēļu izstrādē Windows Phone 7 2. daļas daudzskārienu tīklam

Lapa atjaunota :
Lapas izveides datums :

Programmēšanas! - 2.Izmēģiniet multi-touch

Par šo paraugu

Šeit es gribētu izskaidrot programmu daudzskārienu ievades realizācijai. Operētājsistēmā Windows Phone 7 daudzskārienu ievade, izmantojot skārienpaneli, ir viens no svarīgākajiem elementiem lietotāja ievadei. Tas ir tāpēc, ka atšķirībā no Windows un Xbox 360 galvenais ievades interfeiss ir "skārienpanelis". Var būt Windows tālruņi ar tastatūrām, bet, protams, viņiem tie ne vienmēr ir. Tātad, lai spēle darbotos jebkurā Windows Phone, tai jābūt skārienjutīgai.

Ja jūs ierobežojat skārienpaneli tikai ar "vienu pieskārienu", spēļu veidi, kurus var izveidot, neizbēgami būs ierobežoti, kad runa ir par spēļu veidošanu. Padomājiet par rokas spēļu konsoli (varat to atstāt nekustīgu). Lielākā daļa spēļu konsoļu prasa, lai jūs turētu spēļu kontrolieri (vai faktisko konsoli) ar abām rokām un vienlaikus nospiestu vairākas pogas.

Operētājsistēmā Windows Phone 7 nav tik daudz pogu kā spēļu vadāmierīcēm, un tai ne vienmēr ir tastatūra. Tāpēc virtuālos taustiņus un pogas var novietot uz ekrāna, un, nospiežot tos, tas ir neērti, jo tos nevar nospiest vienlaicīgi tikai ar vienu pieskārienu.

Protams, papildus iepriekš minētajam virtuālās pogas piemēram, multi-touch ir nepieciešams spēlēm, kurās vienā ekrānā darbojas vairāki cilvēki, piemēram, "saspiest un izstiept (pārvietot divus punktus tuvāk vai tālāk viens no otra)", kas ir izplatīts daudzskārienu režīmā.

Starp citu, ievads ir garš, bet šajā paraugā es vēlētos iegūt daudzskārienu informāciju, izmantojot klasi, kas veltīta skārienjutīgiem paneļiem. Ir jautri pēkšņi izveidot paraugu, ko var atskaņot ar multi-touch, bet vispirms es gribētu uzzināt, kāda veida informāciju var iegūt ar multi-touch. Ir daži ieradumi, tāpēc, vispirms tos zinot, jūs varat samazināt laiku, kas pavadīts, pētot cēloni, piemēram, ja tas nedarbojas labi programmēšanā vēlāk.

Šīs izlases programmas mērķi

Parādiet un apstipriniet informāciju, kad tiek veikts daudzskāriens.

図 1 :タッチしたときにタッチ情報がテキストで表示される
1. attēls: Pieskaroties skārienvadībai, skārieninformācija tiek parādīta kā teksts

Programma — lauku deklarēšana

Laukiem jābūt apzīmētiem ar TouchPanelCapabilities struktūru un TouchCollection struktūru.

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

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

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

"TouchPanelCapabilities struktūra" ir struktūra, kurai var būt paša skārienpaneļa funkcijas kā parametri. To izmanto, lai pārbaudītu, vai atjaunināšanas laikā var izmantot skārienpaneli.

TouchCollection struktūrā ir saraksts ar informāciju par pašlaik pieskarto stāvokli. Ja tiek konstatēti vairāki pieskārieni, var izgūt vairākas "TouchLocation struktūras". Vairāk par to vēlāk.

Programma - fontu ielāde

Pirms teksta zīmēšanas ekrānā pievienojiet fonta definīciju savam satura projektam un ielādējiet to ar metodi Game.LoadContent. Tas nav tieši saistīts ar skārienjutīgiem paneļiem, tāpēc es izlaidīšu detalizētu skaidrojumu.

図 2 :コンテンツプロジェクトに「Font.spritefont」を追加しておく
2. attēls: Pievienojiet "Font.spritefont" savam satura projektam

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

Programma - iegūstiet informāciju par skārienjutīgo paneli

Iegūstiet skārienpaneļa informāciju Game.Update metodē.

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

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

Varat izsaukt metodi "TouchPanel.GetCapabilities", lai iegūtu skārienpaneļa funkcijas informāciju. Ir divu veidu informācija, ko var iegūt: "Vai skārienpaneli var izmantot?" un "Maksimālais skārienjutīgo punktu skaits, ko var iegūt ar skārienpaneli". Neviens no tiem spēles laikā nemainās, tāpēc es domāju, ka nav problēmu, ja to saņemat par spēli.Inicializējiet metodi, bet nākotnē parādās ierīces, kas var noņemt skārienpaneli (skārienpanelis, ko var savienot ar USB vai faktiskajām ierīcēm, kas nav Windows Phone), un tas ir aprakstīts atjaunināšanas metodē.

Tāpat nav jāpārbauda, vai skārienpaneli var izmantot, jo to vienmēr var izmantot operētājsistēmā Windows Phone 7, taču, koplietojot kodu ar Windows un Xbox 360, šī aparatūra nav nepieciešama ievades saskarnes un ir jāpārbauda.

Ja varat apstiprināt, ka skārienpanelis ir pieejams rekvizītā "TouchPanelCapabilities.IsConnected", metode "TouchPanel.GetState" iegūst pašreizējo skāriena stāvokli.

Sākotnēji dažas darbības apstrāde tiek veikta pēc skārieninformācijas iegūšanas, taču šajā paraugā informācija tiek parādīta tikai, tāpēc Game.Update metodē turpmāka apstrāde netiek veikta.

Programma - iegūstiet maksimālo saziņas punktu skaitu, ko varat iegūt

Maksimālais skārienpunktu skaits, ko var izgūt, ir aptuveni fiksēts, tāpēc bieži vien nav nepieciešams tos izgūt spēles laikā, bet jūs varat iegūt maksimālo saziņas punktu skaitu, ko var izgūt no TouchPanelCapabilities.MaximumTouchCount rekvizīts. Piemēram, ja rekvizīts MaximumTouchCount ir "4", informāciju par piekto pozīciju nevar iegūt, pieskaroties skārienpanelim ar pieciem pirkstiem.

Šajā paraugā izmantotā viedtālruņa "HTC 7 Trophy" iegādes skaits bija "4". (Starp citu, XNA Game Studio 4.0 ir definēts, lai vienmēr atgrieztos 4.) Windows Phone 7 specifikācijā teikts, ka tas ir vairāk nekā 4 punkti, tāpēc tas neatgriež mazāk par 4.)

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

図 3 :TouchPanelCapabilities.MaximumTouchCount プロパティの取得数
3. attēls: TouchPanelCapabilities.MaximumTouchCount rekvizītu izguves skaits

Programma - iegūt skārienjutīgu informāciju

Izgūtā TouchCollection struktūra satur vairāku skārienu informāciju. Piemēram, ja pieskaraties ar diviem pirkstiem, tas parasti satur divus pieskārienus.

Skārieninformācijas skaitu var izgūt rekvizītā TouchCollection.Count. Skārienjutīga informācija tiek atkārtoti parādīta paziņojumā tik reižu, cik tā tiek iegūta. Sākotnēji nav problēmu cilpot ar foreach, bet, tā kā mēs izmantosim masīva indeksu (int indeksu) vēlākā skaidrojumā, mēs to cilpojam ar.

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

Tagad katra skārienjutīgā informācija tiek iegūta kā "TouchLocation" struktūra. Ja tas cilpo ar for, to var iegūt ar "TouchCollection[index]". (Jūs varat arī iegūt "TouchLocation" struktūru tieši foreach.)

No struktūras "TouchLocation" var iegūt šādus četrus informācijas veidus, un katra informācija tiek parādīta paraugā.

Kad jūs to faktiski palaižat, skārienjutīgā informācija tiek parādīta, kā parādīts tālāk. Tā kā jūs pieskaraties ar trim pirkstiem, jūs varat redzēt trīs pieskārienus. Starp citu, ja pieskarsieties ar pieciem pirkstiem, jūs redzēsit tikai līdz četriem. (Jo maksimālais iegādes reižu skaits ir 4)

図 4 :3 本の指でタッチしているところ
4. attēls: Pieskaršanās ar trim pirkstiem

Programma — lietas, no kurām jāuzmanās, izgūstot skārieninformāciju 1 (indekss un ID)

Es iepriekš minēju, ka ir lietas, kas jāpatur prātā, strādājot ar skārienjutīgu informāciju, bet pirmais ir "indekss" un "ID". Indekss vienkārši attiecas uz masīva indeksu.

Es domāju, ka ir vieglāk saprast, ja jūs to izmēģināt uz īstas mašīnas, nekā izskaidrot to rakstiski. Piemēram, pieņemsim, ka darbojaties ar diviem pirkstiem, "rādītājpirkstu" un "vidējo pirkstu", un vispirms pieskarieties ar rādītājpirkstu.

図 5 :人差し指でタッチ
5. attēls: Pieskarieties ar rādītājpirkstu

Kā parādīts ekrānā, indekss būs "0". Pēc tam pieskarieties tam ar vidējo pirkstu.

図 6 :中指でタッチ
6. attēls: Vidējā pirksta pieskāriens

Šajā stāvoklī jūs pieskaraties ar diviem pirkstiem, tāpēc tiek parādīti divi informācijas gabali. Indekss, kam pieskaras ar vidējo pirkstu, ir "1".

Pacelsim šeit rādītājpirkstu. Tad skārienjutīgā informācija izskatīsies šādi.

図 7 :人差し指を放す
7. attēls: Atlaidiet rādītājpirkstu

Kā jūs, iespējams, pamanījāt līdz šim, tās informācijas indekss, kurai pieskaraties ar vidējo pirkstu, ir "0". Ja, pārvietojot rakstzīmi, pārvaldi pēc indeksa, iepriekš minētās darbības rezultātā tiks veiktas tālāk norādītās darbības.

・ Pārvietojiet rakstzīmi "A" ar rādītājpirkstu

・ Pārvietojiet rakstzīmi "B" ar vidējo pirkstu šādā stāvoklī.

・ Atlaidiet rādītājpirkstu, pārvietojot rakstzīmi ar vidējo pirkstu

・ Vidējā pirksta kontrolētais raksturs pēkšņi pārslēdzas uz "A"

Vēl viena parādība ir tāda, ka, atkārtoti atbrīvojot vai pieskaroties vienam no diviem pirkstiem, pieskaroties tiem, pirmās pieskāriena informācijas zīmējuma teksts var mirgot. Tas ir tāpēc, ka otrais pirksts pārtrauc indeksu "0" brīdī, kad pieskaraties vai atlaižat to.

Kā minēts iepriekš, skārienjutīgās informācijas indekss un secība, kad daudzskārieni pieskaras, neatbilst secībai, kādā tie tiek pieskarties. Tāpēc, ja vēlaties veikt kādas darbības, nepārvaldiet tās TouchCollection indeksā.

Tas, kas būtu jāpārvalda, ir tas, ka "TouchLocation" struktūrai ir rekvizīts "Id", un ID tiek pārrakstīts ar jaunu vērtību katru reizi, kad tam pieskaras, bet pieskaroties tiek garantēta attiecība starp saskares punktu un ID, tāpēc mēs to pārvaldīsim.

Protams, tas nenozīmē, ka jums tas ir jāpārvalda ar ID, un dažos gadījumos pietiek tikai ar pieskāriena pozīciju. Piemēram, ja ekrānā vienkārši pieskaraties pogai, varat noteikt, ka nospiedāt pogu, pārbaudot skāriena pozīciju neatkarīgi no ID. Tomēr, iekļaujot vilkšanas apstrādi, pozīcija vienmēr mainās, tāpēc es domāju, ka to joprojām vajadzētu noteikt pēc ID.

Programma - Lietas, kas jāpatur prātā, iegādājoties skārieninformāciju 2 (iegūtās skārieninformācijas skaits)

Lai gan tas nav iekļauts raksta programmā, paraugs ekrāna apakšā uzzīmē virkni "GetMaxTouchCount" un "maksimālo vienlaikus iegūto skārienjutīgās informācijas skaitu". Tas iepriekš ir parādījis maksimālo skārienjutīgās informācijas skaitu, kas iegūts ar metodi "TouchPanel.GetState", bet šajā testa mašīnā rekvizīts "TouchPanelCapabilities.MaximumTouchCount" ir 4, tāpēc šeit parādītajai maksimālajai vērtībai parasti jābūt 4. Ja jūs uz tā uzliekat piecus pirkstus, tas joprojām būs 4.

図 8 :5 本の指を置いたときの数値
8. attēls: Piecu pirkstu skaitlis

Veiksim nelielu eksperimentu. Mēģiniet atkārtot skārienpaneli ar vairākiem pirkstiem lielā ātrumā. Tas ir atkarīgs no testa mašīnas, taču skaitlis var pārsniegt 4, pirms jūs to zināt.

図 9 :GetMaxTouchCount が 4 を超えている
9. attēls: GetMaxTouchCount ir lielāks par 4

Faktiski skārienjutīgā informācija, kas iegūta, izmantojot metodi "TouchPanel.GetState", nav skāriena informācija metodes "TouchPanel.GetState" izsaukšanas brīdī, bet brīdis, kad pieskaraties tai, un brīdis, kad to atbrīvojat no pēdējā atjaunināšanas laika, tiek saglabāts kešatmiņā. Tāpēc, lai gan vienlaikus var noteikt līdz pat četriem pieskārieniem, pieskaršanās tam pašam pirkstam vēlreiz tiek uzskatīta par atsevišķu pieskārienu, tāpēc var iegūt vairāk skāriena informācijas nekā TouchPanelCapabilities.MaximumTouchCount.

Tāpēc, pat ja TouchPanelCapabilities.MaximumTouchCount ir 4, ja ar skārienvadību saistīto datu masīva elementu skaits ir fiksēts ar 4, atkarībā no apstrādes metodes var rasties indeksa pārslodzes kļūda.

Starp citu, XNA Game Studio palīdzībā TouchCollection.Count rekvizīta maksimālā vērtība ir aprakstīta kā "8", tādēļ, ja vēlaties noteikt elementu skaitu masīvā, elementu skaits jāiestata vismaz uz 8. (Ja domājat par turpmākajiem versiju jauninājumiem, iespējams, vēlēsities iekļaut drošības klauzulu, lai indekss netiktu pārsniegts.)

Šī parauga kopsavilkums

Šoreiz mēs pārbaudījām dažādus parametrus informācijai, kas iegūta no multi-touch. Mēs arī apstiprinājām, ka ir daži punkti, kas jāpatur prātā, iegādājoties skārienpaneļa informāciju. Pamatojoties uz šīm zināšanām, es vēlētos izskaidrot paraugu, kas faktiski izmanto multi-touch.