Kosketusohjaukset Windows Phone 7:n pelin kehittämisessä, osa 2 Multitouch

Sivu päivitetty :
Sivun luontipäivämäärä :

Ohjelmointi! - 2.Kokeile monikosketusta

Tietoja tästä näytteestä

Tässä haluaisin selittää ohjelman monikosketustulon toteuttamiseksi. Windows Phone 7:ssä kosketusnäyttö kosketuspaneelin kautta on yksi tärkeimmistä käyttäjän syötteen kohteista. Tämä johtuu siitä, että toisin kuin Windows ja Xbox 360, päätuloliitäntä on "kosketuspaneeli". Voi olla Windows-puhelimia, joissa on näppäimistöt, mutta tietysti heillä ei aina ole niitä. Joten, jotta peli toimisi missä tahansa Windows Phone -puhelimessa, sen on oltava kosketuskykyinen.

Jos rajoitat kosketuspaneelin vain "yhteen kosketukseen", pelityypit, joita voidaan tehdä, ovat väistämättä rajoitettuja pelien tekemisessä. Ajattele kädessä pidettävää pelikonsolia (voit jättää sen paikallaan). Useimmat pelikonsolit edellyttävät, että pidät peliohjainta (tai todellista konsolia) molemmin käsin ja painat useita painikkeita samanaikaisesti.

Windows Phone 7:ssä ei ole yhtä paljon painikkeita kuin peliohjaimissa, eikä siinä välttämättä ole näppäimistöä. Siksi virtuaaliset näppäimet ja painikkeet voidaan sijoittaa näytölle, ja kun niitä painetaan, se on hankalaa, koska niitä ei voi painaa samanaikaisesti vain yhdellä kosketuksella.

Tietenkin yllä olevan virtuaalisen painikkeen esimerkin lisäksi monikosketus on välttämätöntä peleissä, joissa useat ihmiset käyttävät yhtä näyttöä, kuten "nipistä ja venytä (siirrä kaksi pistettä lähemmäksi tai kauemmas toisistaan)", joka on yleistä monikosketuksessa.

Muuten, johdanto on pitkä, mutta tässä näytteessä haluaisin hankkia monikosketustietoja kosketuspaneeleille omistetun luokan avulla. On hauskaa luoda näyte, jota voidaan pelata yhtäkkiä monikosketuksella, mutta ensin haluaisin selvittää, millaista tietoa voidaan saada monikosketuksella. On joitain tapoja, joten tuntemalla ne ensin voit vähentää syyn tutkimiseen käytettyä aikaa, kuten silloin, kun se ei toimi hyvin ohjelmoinnissa myöhemmin.

Tämän esimerkkiohjelman tavoitteet

Näytä ja vahvista tiedot, kun monikosketus suoritetaan.

図 1 :タッチしたときにタッチ情報がテキストで表示される
Kuva 1: Kosketustiedot näytetään tekstinä, kun niitä kosketetaan

Ohjelma - Kenttien ilmoittaminen

Kenttien nimet on oltava TouchPanelCapabilities Structure ja TouchCollection Structure.

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

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

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

"TouchPanelCapabilities-rakenne" on rakenne, jonka parametreina voivat olla itse kosketuspaneelin toiminnot. Sitä käytetään tarkistamaan, voidaanko kosketuspaneelia käyttää päivityksen aikana.

TouchCollection-rakenne sisältää luettelon tiedoista tällä hetkellä kosketettavasta tilasta. Jos havaitaan useita kosketuksia, voidaan hakea useita "TouchLocation-rakenteita". Lisää siitä myöhemmin.

Ohjelma - Fonttien lataaminen

Ennen kuin piirrät tekstiä näytölle, lisää fonttimääritys sisältöprojektiisi ja lataa se Game.LoadContent-menetelmällä. Tämä ei liity suoraan kosketuspaneeleihin, joten jätän yksityiskohtaisen selityksen pois.

図 2 :コンテンツプロジェクトに「Font.spritefont」を追加しておく
Kuva 2: Lisää "Font.spritefont" sisältöprojektiisi

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

Ohjelma - Hanki kosketuspaneelin tiedot

Hanki kosketuspaneelin tiedot Game.Update-menetelmän sisällä.

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

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

Voit soittaa "TouchPanel.GetCapabilities" -menetelmään saadaksesi kosketuspaneelin toimintotiedot. Hankittavia tietoja on kahdenlaisia: "Voidaanko kosketuspaneelia käyttää?" ja "Kosketuspaneelin hankkimien kosketuspisteiden enimmäismäärä". Kumpikaan niistä ei muutu pelin aikana, joten mielestäni ei ole mitään ongelmaa, jos saat sen Game.Initialize-menetelmän mukaan, mutta tulevaisuudessa näkyviin tulevat laitteet, jotka voivat poistaa kosketuspaneelin (kosketuspaneeli, joka voidaan liittää USB: hen tai muihin laitteisiin kuin Windows Phone), ja se on kuvattu päivitysmenetelmässä.

Ei myöskään tarvitse tarkistaa, voidaanko kosketuspaneelia käyttää, koska sitä voidaan aina käyttää Windows Phone 7: ssä, mutta kun jaat koodia Windowsin ja Xbox 360: n kanssa, näitä laitteita ei tarvita syöttöliitäntöihin ja ne on tarkistettava.

Jos voit vahvistaa, että kosketuspaneeli on käytettävissä "TouchPanelCapabilities.IsConnected"-ominaisuudessa, "TouchPanel.GetState"-menetelmä saa nykyisen kosketustilan.

Alun perin osa toimintojen käsittelystä suoritetaan kosketustietojen hankkimisen jälkeen, mutta tässä näytteessä tiedot näytetään vain, joten Game.Update-menetelmässä ei tehdä jatkokäsittelyä.

Ohjelma - Hanki mahdollisimman paljon kosketuspisteitä

Noudettavien kosketuspisteiden enimmäismäärä on suunnilleen kiinteä, joten niitä ei usein tarvitse hakea pelin aikana, mutta voit saada enimmäismäärän kosketuspisteitä, jotka voidaan noutaa TouchPanelCapabilities.MaximumTouchCount-ominaisuudesta. Jos esimerkiksi MaximumTouchCount-ominaisuus on "4", et voi saada viidennen sijainnin tietoja koskettamalla kosketuspaneelia viidellä sormella.

Tässä otoksessa käytetyn älypuhelimen "HTC 7 Trophy" hankintojen määrä oli "4". (Muuten, XNA Game Studio 4.0 on määritetty palauttamaan aina 4.) Windows Phone 7 -määrityksen mukaan se on yli 4 pistettä, joten se ei palauta alle 4.)

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

図 3 :TouchPanelCapabilities.MaximumTouchCount プロパティの取得数
Kuva 3: TouchPanelCapabilities.MaximumTouchCount-ominaisuuksien noutomäärä

Ohjelma - Hanki kosketustiedot

Haettu TouchCollection-rakenne sisältää useita kosketustietoja. Jos esimerkiksi kosketat kahdella sormella, se sisältää yleensä kaksi kosketusta.

Kosketustietojen määrä voidaan hakea TouchCollection.Count-ominaisuudesta. Kosketustiedot näytetään toistuvasti for-lauseessa niin monta kertaa kuin ne saadaan. Alun perin foreachin kanssa silmukoinnissa ei ole ongelmaa, mutta koska käytämme matriisihakemistoa (int-indeksiä) myöhemmässä selityksessä, silmukoimme sen kanssa.

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

Nyt jokainen kosketustieto saadaan "TouchLocation" -rakenteena. Jos se silmukoi for: n kanssa, se voidaan hankkia "TouchCollection [index]": llä. (Voit myös saada "TouchLocation" -rakenteen suoraan foreachiin.)

Seuraavat neljä tietotyyppiä voidaan saada "TouchLocation" -rakenteesta, ja jokainen tieto näkyy näytteessä.

Kun suoritat sen, kosketustiedot näytetään alla olevan kuvan mukaisesti. Koska kosketat kolmella sormella, näet kolme kosketusta. Muuten, jos kosketat viidellä sormella, näet vain neljä. (Koska hankintojen enimmäismäärä on 4)

図 4 :3 本の指でタッチしているところ
Kuva 4: Koskettaminen kolmella sormella

Ohjelma - Huomioitavaa kosketustietoja haettaessa 1 (indeksi ja tunnus)

Mainitsin edellä, että kosketustietoja käsiteltäessä on pidettävä mielessä asioita, mutta ensimmäinen on "indeksi" ja "tunnus". Indeksi viittaa yksinkertaisesti taulukkoindeksiin.

Mielestäni on helpompi ymmärtää, jos kokeilet sitä todellisella koneella kuin selität sen kirjallisesti. Oletetaan esimerkiksi, että käytät kahta sormea, "etusormea" ja "keskisormea", ja kosketat ensin etusormella.

図 5 :人差し指でタッチ
Kuva 5: Kosketa etusormella

Kuten näytöllä näkyy, indeksi on "0". Kosketa sitä sitten keskisormella.

図 6 :中指でタッチ
Kuva 6: Keskisormen kosketus

Tässä tilassa kosketat kahdella sormella, joten kaksi tietoa näytetään. Keskisormella kosketettu indeksi on "1".

Nostetaan etusormemme tähän. Sitten kosketustiedot näyttävät seuraavalta.

図 7 :人差し指を放す
Kuva 7: Vapauta etusormi

Kuten olet ehkä jo huomannut, keskisormella koskettamiesi tietojen hakemisto on "0". Jos hallitset merkkiä indeksin mukaan, kun siirrät sitä, yllä oleva toiminto johtaa seuraaviin toimintoihin.

・ Liikuta A-merkkiä etusormellasi

・ Siirrä merkkiä "B" keskisormella tässä tilassa.

・ Vapauta etusormi samalla, kun liikutat hahmoa keskisormella

・ Keskisormen ohjaama hahmo vaihtaa yhtäkkiä "A": ksi

Toinen ilmiö on, että jos vapautat tai kosketat toistuvasti yhtä kahdesta sormesta koskettaessasi niitä, ensimmäisen kosketustiedon piirustusteksti voi välkkyä. Tämä johtuu siitä, että toinen sormi keskeyttää indeksin "0" heti, kun kosketat tai vapautat sen.

Kuten edellä mainittiin, indeksi ja kosketustietojen järjestys, kun monikosketus tapahtuu, eivät vastaa järjestystä, jossa niitä kosketetaan. Jos siis haluat suorittaa toimintoja, älä hallitse niitä TouchCollection-indeksissä.

On hallittava, että "TouchLocation" -rakenteella on "Id" -ominaisuus, ja tunnus kirjoitetaan uudelleen uudella arvolla joka kerta, kun sitä kosketetaan, mutta kosketuspisteen ja tunnuksen välinen suhde taataan kosketettaessa, joten hallitsemme sitä.

Tämä ei tietenkään tarkoita, että sinun on hallittava sitä tunnuksella, ja joissakin tapauksissa pelkkä kosketusasento riittää. Jos esimerkiksi kosketat vain painiketta näytöllä, voit määrittää, että painoit painiketta tarkistamalla kosketusasennon tunnuksesta riippumatta. Ilmanvastuskäsittelyä mukaan lukien sijainti kuitenkin muuttuu aina, joten mielestäni se pitäisi silti määrittää ID: n perusteella.

Ohjelma - Asiat, jotka on pidettävä mielessä kosketustietoja hankittaessa 2 (hankittujen kosketustietojen määrä)

Vaikka se ei sisälly artikkelin ohjelmaan, näyte piirtää merkkijonon "GetMaxTouchCount" näytön alareunaan ja "samanaikaisesti hankittujen kosketustietojen enimmäismäärän". Tämä on aiemmin näyttänyt "TouchPanel.GetState"-menetelmällä hankittujen kosketustietojen enimmäismäärän, mutta tässä testikoneessa "TouchPanelCapabilities.MaximumTouchCount" -ominaisuus on 4, joten tässä näkyvän enimmäisarvon tulisi yleensä olla 4. Jos laitat siihen viisi sormea, se on silti 4.

図 8 :5 本の指を置いたときの数値
Kuva 8: Viiden sormen numero

Tehdään pieni kokeilu. Yritä toistaa kosketuspaneeli useilla sormilla suurella nopeudella. Se riippuu testikoneesta, mutta luku voi ylittää 4 ennen kuin huomaatkaan.

図 9 :GetMaxTouchCount が 4 を超えている
Kuva 9: GetMaxTouchCount on suurempi kuin 4

Itse asiassa "TouchPanel.GetState" -menetelmällä hankitut kosketustiedot eivät ole kosketustietoja sillä hetkellä, kun kutsut "TouchPanel.GetState" -menetelmää, mutta sillä hetkellä, kun kosketat sitä ja kun vapautat sen viimeisestä päivitysajoituksesta, tallennetaan välimuistiin. Siksi, vaikka jopa neljä kosketusta voidaan havaita samanaikaisesti, saman sormen koskettamista uudelleen käsitellään erillisenä kosketuksena, joten kosketustietoja voidaan saada enemmän kuin TouchPanelCapabilities.MaximumTouchCount.

Siksi, vaikka TouchPanelCapabilities.MaximumTouchCount on 4, jos kosketukseen liittyvien tietojen matriisielementtien määrä on vahvistettu 4: llä, indeksin ylitysvirhe voi ilmetä käsittelymenetelmästä riippuen.

Muuten, XNA Game Studion avulla TouchCollection.Count-ominaisuuden enimmäisarvoa kuvataan nimellä "8", joten jos haluat korjata taulukon elementtien määrän, aseta elementtien lukumäärä vähintään 8: een. (Jos ajattelet tulevia versiopäivityksiä, sinun kannattaa ehkä sisällyttää suojalauseke, jotta hakemisto ei mene yli.)

Yhteenveto tästä näytteestä

Tällä kertaa tarkastelimme erilaisia parametreja monikosketuksesta saaduille tiedoille. Vahvistimme myös, että on joitain seikkoja, jotka on pidettävä mielessä, kun hankit kosketuspaneelin tietoja. Tämän tiedon perusteella haluaisin selittää näytteen, joka todella käyttää monikosketusta.