Lietimo sąveika kuriant žaidimus, skirtus "Windows Phone 7" 2 dalies "Multitouch"

Puslapis atnaujintas :
Puslapio sukūrimo data :

Programavimo! - 2.Išbandykite kelių prisilietimų funkciją

Apie šį pavyzdį

Čia norėčiau paaiškinti kelių palietimų įvesties realizavimo programą. "Windows Phone 7" kelių lietimų įvestis per jutiklinį skydelį yra vienas iš svarbiausių vartotojo įvesties elementų. Taip yra todėl, kad, skirtingai nei "Windows" ir "Xbox 360", pagrindinė įvesties sąsaja yra "jutiklinis skydelis". Gali būti "Windows" telefonų su klaviatūromis, bet, žinoma, jie ne visada jas turi. Taigi, kad žaidimas veiktų bet kuriame "Windows Phone", jis turi būti liečiamas.

Jei apribosite jutiklinį skydelį tik "vienu palietimu", žaidimų, kuriuos galima sukurti, tipai neišvengiamai bus riboti, kai reikia kurti žaidimus. Pagalvokite apie rankinę žaidimų konsolę (galite palikti ją nejudančią). Daugumoje žaidimų konsolių reikia laikyti žaidimo valdiklį (arba tikrąją konsolę) abiem rankomis ir vienu metu paspausti kelis mygtukus.

"Windows Phone 7" neturi tiek mygtukų, kiek žaidimų valdikliai, ir nebūtinai turi klaviatūrą. Todėl ekrane gali būti dedami virtualūs klavišai ir mygtukai, o juos paspaudus nepatogu, nes jų negalima vienu metu paspausti tik vienu paspaudimu.

Žinoma, be aukščiau pateikto virtualaus mygtuko pavyzdžio, "multi-touch" yra būtinas žaidimams, kuriuose keli žmonės valdo vieną ekraną, pvz., "suspausti ir ištempti (perkelti du taškus arčiau ar toliau)", kuris yra įprastas kelių palietimų metu.

Beje, įvadas yra ilgas, tačiau šiame pavyzdyje norėčiau gauti kelių prisilietimų informaciją naudodamas klasę, skirtą jutikliniams skydeliams. Smagu sukurti pavyzdį, kurį būtų galima žaisti su keliais prisilietimais staiga, bet pirmiausia norėčiau sužinoti, kokią informaciją galima gauti naudojant kelių palietimų. Yra keletas įpročių, todėl pirmiausia juos žinodami, galite sutrumpinti laiką, praleistą tiriant priežastį, pavyzdžiui, kai vėliau programuojant jis neveikia gerai.

Šios pavyzdinės programos tikslai

Rodykite ir patvirtinkite informaciją, kai atliekami keli palietimai.

図 1 :タッチしたときにタッチ情報がテキストで表示される
1 paveikslas: lietimo informacija palietus rodoma kaip tekstas

Programa - laukų deklaravimas

Laukai turi būti pažymėti kaip TouchPanelCapabilities Structure ir TouchCollection Structure.

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

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

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

"TouchPanelCapabilities" struktūra yra struktūra, kuri gali turėti paties jutiklinio skydelio funkcijas kaip parametrus. Jis naudojamas patikrinti, ar atnaujinant galima naudoti jutiklinį skydelį.

"TouchCollection" struktūroje yra informacijos apie šiuo metu paliestą būseną sąrašas. Jei aptinkami keli prisilietimai, galima gauti kelias "TouchLocation struktūras". Daugiau apie tai vėliau.

Programa - šriftų įkėlimas

Prieš piešdami tekstą ekrane, pridėkite šrifto apibrėžimą prie savo turinio projekto ir įkelkite jį naudodami Game.LoadContent metodą. Tai nėra tiesiogiai susiję su jutikliniais skydeliais, todėl praleisiu išsamų paaiškinimą.

図 2 :コンテンツプロジェクトに「Font.spritefont」を追加しておく
2 paveikslas: Pridėkite "Font.spritefont" prie savo turinio projekto

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

Programa - gaukite jutiklinio skydelio informaciją

Gaukite jutiklinio skydelio informaciją "Game.Update" metode.

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

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

Galite paskambinti "TouchPanel.GetCapabilities" metodu, kad gautumėte jutiklinio skydelio funkcijų informaciją. Galima gauti dviejų tipų informaciją: "Ar galima naudoti jutiklinį skydelį?" ir "Maksimalus jutiklinių taškų, kuriuos gali gauti jutiklinis skydelis, skaičius". Nė vienas iš jų žaidimo metu nesikeičia, todėl manau, kad nėra jokių problemų, jei jį gausite pagal "Game.Initialize" metodą, tačiau ateityje pasirodys įrenginiai, galintys pašalinti jutiklinį skydelį (jutiklinis skydelis, kurį galima prijungti prie USB arba faktinių įrenginių, išskyrus "Windows Phone"), ir jis aprašytas atnaujinimo metode.

Be to, nereikia tikrinti, ar galima naudoti jutiklinį skydelį, nes jį visada galima naudoti "Windows Phone 7", tačiau bendrinant kodą su "Windows" ir "Xbox 360", ši aparatinė įranga nėra būtina įvesties sąsajoms ir ją reikia patikrinti.

Jei galite patvirtinti, kad jutiklinis skydelis yra ypatybėje "TouchPanelCapabilities.IsConnected", "TouchPanel.GetState" metodas gauna dabartinę jutiklinę būseną.

Iš pradžių kai kurie operacijų apdorojimai atliekami gavus jutiklinę informaciją, tačiau šiame pavyzdyje informacija rodoma tik, todėl tolesnis apdorojimas Game.Update metodu neatliekamas.

Programa - gaukite maksimalų kontaktinių taškų skaičių, kurį galite gauti

Maksimalus jutiklinių taškų, kuriuos galima gauti, skaičius yra apytiksliai fiksuotas, todėl žaidimo metu dažnai jų nereikia gauti, tačiau galite gauti maksimalų jutiklinių taškų skaičių, kurį galima gauti iš "TouchPanelCapabilities.MaximumTouchCount" ypatybės. Pavyzdžiui, jei ypatybė MaximumTouchCount yra "4", negalite gauti penktos padėties informacijos paliesdami jutiklinį skydelį penkiais pirštais.

Šiame pavyzdyje naudojamo išmaniojo telefono "HTC 7 Trophy" įsigijimų skaičius buvo "4". (Beje, "XNA Game Studio 4.0" yra apibrėžta taip, kad visada grąžintų 4.) "Windows Phone 7" specifikacijoje teigiama, kad jis yra didesnis nei 4 taškai, todėl jis nepateikia mažiau nei 4.)

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

図 3 :TouchPanelCapabilities.MaximumTouchCount プロパティの取得数
3 paveikslas: TouchPanelCapabilities.MaximumTouchCount ypatybių gavimo skaičius

Programa - Gaukite lietimo informaciją

Gautoje "TouchCollection" struktūroje yra kelios jutiklinės informacijos. Pavyzdžiui, jei liečiate dviem pirštais, paprastai yra du prisilietimai.

Jutiklinės informacijos skaičių galima gauti ypatybėje TouchCollection.Count. Jutiklinė informacija pakartotinai rodoma for pareiškime tiek kartų, kiek ji gaunama. Iš pradžių nėra jokių problemų kilpa su foreach, bet kadangi vėlesniame paaiškinime naudosime masyvo indeksą (int index), mes jį sujungsime su 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);
}

Dabar kiekviena jutiklinė informacija gaunama kaip "TouchLocation" struktūra. Jei jis yra kilpinis su for, jį galima gauti naudojant "TouchCollection[index]". ("TouchLocation" struktūrą taip pat galite gauti tiesiai foreach.)

Iš "TouchLocation" struktūros galima gauti šiuos keturis informacijos tipus, o kiekviena informacija rodoma pavyzdyje.

Kai iš tikrųjų jį paleidžiate, jutiklinė informacija rodoma, kaip parodyta toliau. Kadangi liečiate trimis pirštais, galite pamatyti tris prisilietimus. Beje, jei paliesite penkiais pirštais, matysite tik iki keturių. (Nes maksimalus įsigijimų skaičius yra 4)

図 4 :3 本の指でタッチしているところ
4 paveikslas: Prisilietimas trimis pirštais

Programa – dalykai, į kuriuos reikia atkreipti dėmesį gaunant jutiklinę informaciją 1 (rodyklė ir ID)

Aukščiau minėjau, kad yra dalykų, kuriuos reikia atsiminti dirbant su jutikline informacija, tačiau pirmasis yra "indeksas" ir "ID". Indeksas tiesiog nurodo masyvo indeksą.

Manau, kad lengviau suprasti, jei išbandysite tai tikroje mašinoje, nei paaiškinsite raštu. Pavyzdžiui, tarkime, kad dirbate dviem pirštais, "rodomuoju pirštu" ir "viduriniu pirštu", ir pirmiausia palieskite rodomuoju pirštu.

図 5 :人差し指でタッチ
5 paveikslas: Palieskite rodomuoju pirštu

Kaip parodyta ekrane, indeksas bus "0". Tada palieskite jį viduriniu pirštu.

図 6 :中指でタッチ
6 paveikslas: Vidurinio piršto prisilietimas

Šioje būsenoje jūs liečiate dviem pirštais, todėl rodomos dvi informacijos dalys. Viduriniu pirštu paliestas indeksas yra "1".

Čia pakelkime rodomąjį pirštą. Tada jutiklinė informacija atrodys taip.

図 7 :人差し指を放す
7 paveikslas: Atleiskite rodomąjį pirštą

Kaip jau tikriausiai pastebėjote, informacijos, kurią liečiate viduriniu pirštu, indeksas yra "0". Jei valdysite simbolį pagal indeksą, kai jį perkelsite, aukščiau pateikta operacija atliks šiuos veiksmus.

・ Perkelkite simbolį "A" rodomuoju pirštu

・ Perkelkite simbolį "B" viduriniu pirštu toje būsenoje.

・ Atleiskite rodomąjį pirštą judindami simbolį viduriniu pirštu

・ Viduriniu pirštu valdomas simbolis staiga persijungia į "A"

Kitas reiškinys yra tas, kad jei pakartotinai atleidžiate ar paliečiate vieną iš dviejų pirštų, kai juos liečiate, pirmojo prisilietimo informacijos piešimo tekstas gali mirgėti. Taip yra todėl, kad antrasis pirštas nutraukia indeksą "0", kai jį paliečiate arba atleidžiate.

Kaip minėta pirmiau, jutiklinės informacijos indeksas ir tvarka, kai jie liečiami, neatitinka jų palietimo tvarkos. Todėl, jei norite atlikti kokias nors operacijas, nevaldykite jų "TouchCollection" indekse.

Tai, ką reikėtų valdyti, yra tai, kad "TouchLocation" struktūra turi "Id" savybę, o Id yra perrašomas nauja reikšme kiekvieną kartą, kai jis paliečiamas, tačiau liečiant garantuojamas ryšys tarp kontaktinio taško ir ID, todėl mes jį valdysime.

Žinoma, tai nereiškia, kad jūs turite jį valdyti pagal ID, o kai kuriais atvejais pakanka tik prisilietimo padėties. Pavyzdžiui, jei tiesiog paliečiate mygtuką ekrane, galite nustatyti, kad paspaudėte mygtuką, patikrindami jutiklinę padėtį, nepriklausomai nuo ID. Tačiau įtraukiant vilkimo apdorojimą, padėtis visada keičiasi, todėl manau, kad ji vis tiek turėtų būti nustatoma pagal ID.

Programa – dalykai, kuriuos reikia atsiminti įsigyjant jutiklinę informaciją 2 (gautų jutiklinės informacijos skaičius)

Nors jis nėra įtrauktas į straipsnio programą, pavyzdys ekrano apačioje nubrėžia eilutę "GetMaxTouchCount" ir "maksimalų vienu metu įgytos jutiklinės informacijos skaičių". Tai parodė maksimalų jutiklinės informacijos, gautos naudojant "TouchPanel.GetState" metodą, skaičių praeityje, tačiau šiame bandymo įrenginyje "TouchPanelCapabilities.MaximumTouchCount" ypatybė yra 4, todėl čia rodoma maksimali vertė paprastai turėtų būti 4. Jei ant jo uždėsite penkis pirštus, jis vis tiek bus 4.

図 8 :5 本の指を置いたときの数値
8 paveikslas: Penkių pirštų skaičius

Padarykime nedidelį eksperimentą. Pabandykite pakartoti jutiklinį skydelį keliais pirštais dideliu greičiu. Tai priklauso nuo bandymo mašinos, tačiau skaičius gali viršyti 4, kol to nežinote.

図 9 :GetMaxTouchCount が 4 を超えている
9 paveikslas: "GetMaxTouchCount" yra didesnis nei 4

Tiesą sakant, jutiklinė informacija, gauta naudojant "TouchPanel.GetState" metodą, nėra jutiklinė informacija skambinant "TouchPanel.GetState" metodu, tačiau momentas, kai jį paliečiate, ir momentas, kai jį atleidžiate nuo paskutinio atnaujinimo laiko, yra talpykloje. Todėl, nors vienu metu galima aptikti iki keturių prisilietimų, pakartotinis prisilietimas prie to paties piršto traktuojamas kaip atskiras prisilietimas, todėl galima gauti daugiau jutiklinės informacijos nei TouchPanelCapabilities.MaximumTouchCount.

Todėl, net jei TouchPanelCapabilities.MaximumTouchCount yra 4, jei su lietimu susijusių duomenų masyvo elementų skaičius yra nustatytas 4, priklausomai nuo apdorojimo metodo, gali atsirasti indekso pertekliaus klaida.

Beje, "XNA Game Studio" pagalba maksimali "TouchCollection.Count" ypatybės vertė apibūdinama kaip "8", todėl, jei norite nustatyti elementų skaičių masyve, turėtumėte nustatyti elementų skaičių bent 8. (Jei galvojate apie būsimus versijos atnaujinimus, galbūt norėsite įtraukti apsaugos sąlygą, kad indeksas nebūtų viršytas.)

Šios imties santrauka

Šį kartą mes ištyrėme įvairius informacijos, gautos iš kelių palietimų, parametrus. Taip pat patvirtinome, kad yra keletas dalykų, kuriuos reikia atsiminti įsigyjant jutiklinio skydelio informaciją. Remdamasis šiomis žiniomis, norėčiau paaiškinti pavyzdį, kuris iš tikrųjų naudoja kelių prisilietimų.