Puutefunktsioonidega interaktsioonid Windows Phone 7 mänguarenduses, 2. osa mitmikpuutefunktsioon

Lehekülg uuendatud :
Lehe loomise kuupäev :

Programmeerimine! - 2.Proovige mitmikpuute

Selle proovi kohta

Siin tahaksin selgitada mitmikpuutesisendi realiseerimise programmi. Windows Phone 7-s on puutepaneeli kaudu mitme puutega sisend kasutaja sisendi jaoks üks olulisemaid elemente. Seda seetõttu, et erinevalt Windowsist ja Xbox 360-st on peamine sisendliides "puutepaneel". Klaviatuuriga Windowsi telefonid võivad olla, kuid muidugi pole neil neid alati. Niisiis, selleks, et mäng töötaks mis tahes Windows Phone'is, peab see olema puutetundlik.

Kui piirate puutepaneeli ainult ühe puudutusega, on mängude tegemisel paratamatult piiratud mängutüübid, mida saab teha. Mõelge pihuarvutiga mängukonsoolile (võite selle paigale jätta). Enamik mängukonsoole nõuab, et hoiaksite mängukontrollerit (või tegelikku konsooli) mõlema käega ja vajutaksite korraga mitut nuppu.

Windows Phone 7-l pole nii palju nuppe kui mängukontrolleritel ja sellel pole tingimata klaviatuuri. Seetõttu võib ekraanile paigutada virtuaalseid klahve ja nuppe ning nende vajutamisel on see ebamugav, sest neid ei saa samaaegselt vajutada ainult ühe puudutusega.

Muidugi on lisaks ülaltoodud virtuaalse nupu näitele multi-touch vajalik mängude jaoks, kus mitu inimest kasutavad ühte ekraani, näiteks "näputäis ja venitage (liigutage kahte punkti lähemale või kaugemale)", mis on tavaline mitmikpuutes.

Muide, sissejuhatus on pikk, kuid selles proovis tahaksin puutepaneelidele pühendatud klassi abil omandada mitme puudutusega teavet. Tore on luua näidis, mida saab äkki mitme puudutusega mängida, kuid kõigepealt tahaksin teada saada, millist teavet saab mitme puudutusega. On mõned harjumused, nii et neid kõigepealt teades saate vähendada põhjuse uurimiseks kuluvat aega, näiteks kui see ei tööta hiljem programmeerimisel hästi.

Selle näidisprogrammi eesmärgid

Kuvage ja kinnitage teave, kui tehakse mitu puudutust.

図 1 :タッチしたときにタッチ情報がテキストで表示される
Joonis 1: puudutatud teave kuvatakse puudutamisel tekstina

Programm - väljade deklareerimine

Väljadel peavad olema sildid TouchPanelCapabilities Structure ja TouchCollection Structure.

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

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

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

"TouchPanelCapabilities struktuur" on struktuur, millel võivad parameetritena olla puutepaneeli enda funktsioonid. Seda kasutatakse selleks, et kontrollida, kas puutepaneeli saab värskendamise ajal kasutada.

TouchCollectioni struktuur sisaldab teavet praegu puudutatud oleku kohta. Kui tuvastatakse mitu puudutust, saab alla laadida mitu "TouchLocation struktuuri". Rohkem sellest hiljem.

Programm - fontide laadimine

Enne teksti joonistamist ekraanile lisage oma sisuprojektile fondi määratlus ja laadige see meetodiga Game.LoadContent. See ei ole otseselt seotud puutepaneelidega, seega jätan üksikasjaliku selgituse välja.

図 2 :コンテンツプロジェクトに「Font.spritefont」を追加しておく
Joonis 2: Lisage oma sisuprojektile "Font.spritefont"

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

Programm - puutepaneeli teabe hankimine

Hankige puutepaneeli teave Game.Update meetodist.

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

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

Puutepaneeli funktsiooniteabe saamiseks võite helistada meetodile "TouchPanel.GetCapabilities". Teavet on võimalik omandada kahte tüüpi: "Kas puutepaneeli saab kasutada?" ja "Puutepunktide maksimaalne arv, mida puutepaneel saab omandada." Kumbki neist ei muutu mängu ajal, nii et ma arvan, et pole mingit probleemi, kui saate selle mängu kohta.Initialize meetod, kuid tulevikus ilmuvad seadmed, mis suudavad puutepaneeli eemaldada (puutepaneel, mida saab ühendada USB-ga või tegelike seadmetega, välja arvatud Windows Phone), ja seda kirjeldatakse värskendusmeetodis.

Samuti pole vaja kontrollida, kas puutepaneeli saab kasutada, kuna seda saab alati kasutada Windows Phone 7-s, kuid koodi jagamisel Windowsi ja Xbox 360-ga pole need riistvarad vajalikud sisendliidesed ja neid tuleb kontrollida.

Kui saate kinnitada, et puutepaneel on saadaval atribuudis "TouchPanelCapabilities.IsConnected", saab meetod "TouchPanel.GetState" praeguse puuteoleku.

Algselt toimub mõni operatsiooni töötlemine pärast puutetundliku teabe omandamist, kuid selles proovis kuvatakse ainult teave, nii et Game.Update meetodis ei toimu edasist töötlemist.

Programm - hankige maksimaalne arv puutepunkte, mida saate

Maksimaalne puutepunktide arv, mida saab alla laadida, on ligikaudu fikseeritud, nii et neid pole sageli vaja mängu ajal alla laadida, kuid saate maksimaalse arvu puutepunkte, mida saab alla laadida atribuudist TouchPanelCapabilities.MaximumTouchCount. Näiteks kui atribuut MaximumTouchCount on "4", ei saa te viienda asukoha teavet, puudutades puutepaneeli viie sõrmega.

Selles valimis kasutatud nutitelefoni "HTC 7 Trophy" omandamiste arv oli "4". (Muide, XNA Game Studio 4.0 on määratletud nii, et see tagastab alati 4.) Windows Phone 7 spetsifikatsioon ütleb, et see on rohkem kui 4 punkti, nii et see ei tagasta vähem kui 4.)

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

図 3 :TouchPanelCapabilities.MaximumTouchCount プロパティの取得数
Joonis 3: TouchPanelCapabilities.MaximumTouchCount Property Retrieval Count

Programm - puutetundliku teabe hankimine

Hangitud TouchCollectioni struktuur sisaldab mitut puuteteavet. Näiteks kui puudutate kahe sõrmega, sisaldab see tavaliselt kahte puudutust.

Puuteteabe arvu saab alla laadida atribuudist TouchCollection.Count. Puutetundlikku teavet kuvatakse väljavõttes korduvalt nii mitu korda, kui see on saadud. Algselt pole foreachiga loopimisega probleeme, kuid kuna kasutame hilisemas selgituses massiiviindeksit (int index), siis silmustame selle 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);
}

Nüüd saadakse iga puuteteave struktuurina "TouchLocation". Kui see on silmus, saab selle hankida "TouchCollection[index]". (Struktuuri "TouchLocation" saate ka otse ettepoole.)

Järgmist nelja tüüpi teavet saab struktuurist "TouchLocation" ja iga teave kuvatakse proovis.

Kui te seda tegelikult käivitate, kuvatakse puuteteave, nagu allpool näidatud. Kuna puudutate kolme sõrmega, näete kolme puudutust. Muide, kui puudutate viie sõrmega, näete ainult kuni nelja. (Kuna maksimaalne omandamiste arv on 4)

図 4 :3 本の指でタッチしているところ
Joonis 4: Puudutamine kolme sõrmega

Programm - asjad, mida puutetundliku teabe 1 (register ja ID) hankimisel jälgida

Eespool mainisin, et puutetundliku teabega tegelemisel tuleb meeles pidada asju, kuid esimene on "indeks" ja "ID". Indeks viitab lihtsalt massiivi indeksile.

Ma arvan, et seda on lihtsam mõista, kui proovite seda tegelikul masinal, kui selgitate seda kirjalikult. Oletame näiteks, et opereerite kahe sõrmega, "nimetissõrm" ja "keskmine sõrm", ning puudutate kõigepealt nimetissõrmega.

図 5 :人差し指でタッチ
Joonis 5: Puudutage nimetissõrmega

Nagu ekraanil näidatud, on indeks "0". Seejärel puudutage seda keskmise sõrmega.

図 6 :中指でタッチ
Joonis 6: Keskmise sõrme puudutus

Selles olekus puudutate kahe sõrmega, nii et kuvatakse kaks teavet. Keskmise sõrmega puudutatud indeks on "1".

Tõstame siin oma nimetissõrme. Seejärel näeb puuteteave välja järgmine.

図 7 :人差し指を放す
Joonis 7: nimetissõrme vabastamine

Nagu olete nüüdseks märganud, on keskmise sõrmega puudutatava teabe indeks "0". Kui haldate märki selle teisaldamisel indeksi järgi, viib ülaltoodud toiming järgmiste toiminguteni.

・ Liigutage nimetissõrmega märki "A"

・ Liigutage märki "B" keskmise sõrmega selles olekus.

・ Vabastage nimetissõrm, liigutades märki keskmise sõrmega

・ Keskmise sõrmega juhitav tegelane lülitub äkki "A" -le

Teine nähtus on see, et kui vabastate või puudutate korduvalt ühte kahest sõrmest, puudutades neid, võib esimese puutetundliku teabe joonistustekst virvendada. Seda seetõttu, et teine sõrm katkestab indeksi "0" hetkel, kui seda puudutate või vabastate.

Nagu eespool mainitud, ei vasta indeks ja puutetundliku teabe järjekord mitmikpuute korral nende puudutamise järjekorrale. Seega, kui soovite teha mis tahes toiminguid, ärge hallake neid TouchCollectioni registris.

Mida tuleks hallata, on see, et struktuuril "TouchLocation" on omadus "Id" ja ID kirjutatakse iga kord, kui seda puudutatakse, ümber uue väärtusega, kuid puutepunkti ja ID vaheline seos on puudutamise ajal tagatud, nii et me haldame seda.

Loomulikult ei tähenda see, et peate seda haldama ID-ga, ja mõnel juhul piisab ainult puuteasendist. Näiteks kui puudutate lihtsalt ekraanil olevat nuppu, saate kindlaks teha, et vajutasite nuppu, kontrollides puuteasendit sõltumata ID-st. Kuid lohistamise töötlemise lisamisel muutub positsioon alati, nii et ma arvan, et selle tuleks siiski määrata ID-ga.

Programm – asjad, mida puutetundliku teabe hankimisel meeles pidada 2 (hangitud puuteteabe arv)

Kuigi see ei kuulu artikli programmi, joonistab näidis ekraani allosas stringi "GetMaxTouchCount" ja "samal ajal omandatud puutetundliku teabe maksimaalse arvu". See on varem kuvanud maksimaalse arvu puuteteavet, mis on omandatud meetodiga "TouchPanel.GetState", kuid selles testmasinas on atribuut "TouchPanelCapabilities.MaximumTouchCount" 4, seega peaks siin kuvatav maksimaalne väärtus olema tavaliselt 4. Kui paned sellele viis sõrme, on see ikkagi 4.

図 8 :5 本の指を置いたときの数値
Joonis 8: Viie sõrme number

Teeme väikese eksperimendi. Proovige puutepaneeli korrata mitme sõrmega suurel kiirusel. See sõltub katsemasinast, kuid enne kui te seda teate, võib see arv ületada 4.

図 9 :GetMaxTouchCount が 4 を超えている
Joonis 9: GetMaxTouchCount on suurem kui 4

Tegelikult ei ole "TouchPanel.GetState" meetodil omandatud puuteteave "TouchPanel.GetState" meetodi helistamise hetkel puutetundlik teave, vaid hetk, mil seda puudutate, ja hetk, mil vabastate selle viimasest värskendusajastusest, on vahemällu salvestatud. Seega, kuigi korraga saab tuvastada kuni neli puudutust, käsitletakse sama sõrme uuesti puudutamist eraldi puudutusena, nii et võib saada rohkem puuteteavet kui TouchPanelCapabilities.MaximumTouchCount.

Seega, isegi kui TouchPanelCapabilities.MaximumTouchCount on 4, kui puutetundlike andmete massiivielementide arv on fikseeritud 4-ga, võib sõltuvalt töötlemismeetodist tekkida indeksi ületamise viga.

Muide, XNA Game Studio abil kirjeldatakse TouchCollection.Count atribuudi maksimaalset väärtust kui "8", nii et kui soovite massiivi elementide arvu parandada, peaksite elementide arvu määrama vähemalt 8-ni. (Kui mõtlete tulevastele versiooniuuendustele, võiksite lisada kaitseklausli, et indeks ei läheks üle.)

Valimi kokkuvõte

Seekord uurisime multi-touch'ist saadud teabe erinevaid parameetreid. Samuti kinnitasime, et puutepaneeli teabe hankimisel tuleb meeles pidada mõningaid punkte. Nende teadmiste põhjal tahaksin selgitada valimit, mis tegelikult kasutab multi-touchi.