Interaksi sentuhan dalam pembangunan permainan untuk Windows Phone 7 Bahagian 2 Multitouch

Laman dikemaskini :
Tarikh penciptaan halaman :

Pengaturcaraan! - 2.Cuba pelbagai sentuhan

Mengenai sampel ini

Di sini, saya ingin menerangkan program ini untuk merealisasikan input pelbagai sentuhan. Dalam Windows Phone 7, input berbilang sentuhan melalui panel sentuh ialah salah satu item yang paling penting untuk input pengguna. Ini kerana, tidak seperti Windows dan Xbox 360, antara muka input utama ialah "panel sentuh". Mungkin ada telefon Windows dengan papan kekunci, tetapi sudah tentu mereka tidak selalu memilikinya. Jadi, agar permainan berfungsi pada mana-mana Windows Phone, ia perlu berdaya sentuhan.

Jika anda mengehadkan panel sentuh kepada "sentuhan tunggal" sahaja, jenis permainan yang boleh dibuat pasti akan terhad apabila membuat permainan. Fikirkan konsol permainan pegang tangan (anda boleh meninggalkannya pegun). Kebanyakan konsol permainan memerlukan anda memegang pengawal permainan (atau konsol sebenar) dengan kedua-dua tangan dan tekan beberapa butang pada masa yang sama.

Windows Phone 7 tidak mempunyai banyak butang sebagai pengawal permainan, dan ia tidak semestinya mempunyai papan kekunci. Oleh itu, kekunci dan butang maya boleh diletakkan di skrin, dan apabila menekannya, ia menyusahkan kerana mereka tidak boleh ditekan serentak dengan hanya satu sentuhan.

Sudah tentu, sebagai tambahan kepada contoh butang maya di atas, berbilang sentuhan diperlukan untuk permainan di mana berbilang orang mengendalikan satu skrin, seperti "cubit dan regangan (bergerak dua mata lebih dekat atau lebih jauh)" yang biasa berlaku dalam pelbagai sentuhan.

Dengan cara ini, pengenalannya panjang, tetapi dalam sampel ini, saya ingin memperoleh maklumat berbilang sentuhan menggunakan kelas yang dikhaskan untuk panel sentuh. Ia menyeronokkan untuk mencipta sampel yang boleh dimainkan dengan pelbagai sentuhan tiba-tiba, tetapi pertama saya ingin mengetahui jenis maklumat yang boleh diperolehi dengan pelbagai sentuhan. Terdapat beberapa tabiat, jadi dengan mengetahuinya terlebih dahulu, anda boleh mengurangkan masa yang dihabiskan untuk menyiasat punca, seperti apabila ia tidak berfungsi dengan baik dalam pengaturcaraan kemudian.

Matlamat program sampel ini

Paparkan dan sahkan maklumat apabila berbilang sentuhan dilakukan.

図 1 :タッチしたときにタッチ情報がテキストで表示される
Rajah 1: Maklumat sentuhan dipaparkan sebagai teks apabila disentuh

Program - Mengisytiharkan Bidang

Medan mesti dilabelkan Struktur Keupayaan Panel Sentuh dan Struktur TouchCollection.

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

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

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

"Struktur TouchPanelCapabilities" adalah struktur yang boleh mempunyai fungsi panel sentuh itu sendiri sebagai parameter. Ia digunakan untuk memeriksa sama ada panel sentuh boleh digunakan semasa mengemas kini.

Struktur TouchCollection mengandungi senarai maklumat mengenai keadaan yang disentuh pada masa ini. Jika berbilang sentuhan dikesan, berbilang "Struktur TouchLocation" boleh diambil semula. Lebih banyak lagi selepas itu.

Program - Memuatkan Fon

Sebelum melukis teks pada skrin, tambahkan definisi fon ke projek kandungan anda dan muatkannya dengan kaedah Game.LoadContent. Ini tidak berkaitan secara langsung dengan panel sentuh, jadi saya akan meninggalkan penjelasan terperinci.

図 2 :コンテンツプロジェクトに「Font.spritefont」を追加しておく
Rajah 2: Tambah "Font.spritefont" pada projek kandungan anda

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

Program - Dapatkan maklumat panel sentuh

Dapatkan maklumat panel sentuh di dalam kaedah Game.Update.

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

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

Anda boleh menghubungi kaedah "TouchPanel.GetCapabilities" untuk mendapatkan maklumat fungsi panel sentuh. Terdapat dua jenis maklumat yang boleh diperolehi: "Bolehkah panel sentuh digunakan?" dan "Bilangan titik sentuh maksimum yang boleh diperoleh oleh panel sentuh." Kedua-duanya tidak berubah semasa permainan, jadi saya fikir tidak ada masalah jika anda mendapatkannya mengikut kaedah Game.Initialize, tetapi pada masa akan datang, peranti yang boleh mengalih keluar panel sentuh (panel sentuh yang boleh disambungkan ke USB atau peranti sebenar selain daripada Windows Phone) muncul, dan ia diterangkan dalam kaedah Kemas Kini.

Selain itu, tidak perlu menyemak sama ada panel sentuh boleh digunakan kerana ia sentiasa boleh digunakan pada Windows Phone 7, tetapi apabila berkongsi kod dengan Windows dan Xbox 360, perkakasan ini tidak diperlukan antara muka input dan perlu diperiksa.

Jika anda boleh mengesahkan bahawa panel sentuh boleh didapati di hartanah "TouchPanelCapabilities.IsConnected", kaedah "TouchPanel.GetState" mendapat keadaan sentuhan semasa.

Pada asalnya, beberapa pemprosesan operasi dilakukan selepas memperoleh maklumat sentuhan, tetapi dalam sampel ini, maklumat hanya dipaparkan, jadi tiada pemprosesan lanjut dilakukan dalam kaedah Game.Update.

Program - Dapatkan bilangan maksimum titik sentuh yang anda boleh dapatkan

Bilangan maksimum titik sentuh yang boleh diambil adalah kira-kira tetap, jadi tidak selalunya diperlukan untuk mendapatkannya semasa permainan, tetapi anda boleh mendapatkan bilangan maksimum titik sentuh yang boleh diambil dari hartanah TouchPanelCapabilities.MaximumTouchCount. Sebagai contoh, jika sifat MaximumTouchCount adalah "4", anda tidak boleh mendapatkan maklumat kedudukan kelima dengan menyentuh panel sentuh dengan lima jari.

Bilangan pengambilalihan untuk telefon pintar "HTC 7 Trophy" yang digunakan dalam sampel ini ialah "4". (Dengan cara ini, XNA Game Studio 4.0 ditakrifkan untuk sentiasa kembali 4.) Spesifikasi Windows Phone 7 mengatakan ia lebih daripada 4 mata, jadi ia tidak kembali kurang daripada 4.)

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

図 3 :TouchPanelCapabilities.MaximumTouchCount プロパティの取得数
Rajah 3: TouchPanelCapabilities.MaximumTouchCount Harta Kiraan Semula Kiraan

Program - Dapatkan maklumat sentuhan

Struktur TouchCollection yang diambil mengandungi berbilang maklumat sentuhan. Sebagai contoh, jika anda menyentuh dengan dua jari, ia biasanya mengandungi dua sentuhan.

Bilangan maklumat sentuhan boleh diambil dalam sifat TouchCollection.Count. Maklumat sentuhan berulang kali dipaparkan dalam pernyataan sebanyak yang diperolehi. Pada asalnya, tidak ada masalah untuk gelung dengan foreach, tetapi kerana kami akan menggunakan indeks tatasusunan (indeks int) dalam penjelasan kemudian, kami gelung dengannya.

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

Sekarang, setiap maklumat sentuhan diperolehi sebagai struktur "TouchLocation". Jika ia gelung dengan, ia boleh didapati dengan "TouchCollection[index]". (Anda juga boleh mendapatkan struktur "TouchLocation" secara langsung dalam foreach.)

Empat jenis maklumat berikut boleh didapati dari struktur "TouchLocation", dan setiap maklumat dipaparkan dalam sampel.

Apabila anda benar-benar menjalankannya, maklumat sentuhan dipaparkan seperti yang ditunjukkan di bawah. Oleh kerana anda menyentuh dengan tiga jari, anda boleh melihat tiga sentuhan. Dengan cara ini, jika anda menyentuh dengan lima jari, anda hanya akan melihat sehingga empat. (Kerana bilangan maksimum pengambilalihan ialah 4)

図 4 :3 本の指でタッチしているところ
Rajah 4: Menyentuh dengan tiga jari

Program - Perkara yang perlu diperhatikan apabila mendapatkan maklumat sentuhan 1 (indeks dan ID)

Saya menyebut di atas bahawa ada perkara yang perlu diingat ketika berurusan dengan maklumat sentuhan, tetapi yang pertama adalah "indeks" dan "ID". Indeks hanya merujuk kepada indeks tatasusunan.

Saya fikir lebih mudah difahami jika anda mencubanya pada mesin sebenar daripada menerangkannya secara bertulis. Sebagai contoh, katakan anda beroperasi dengan dua jari, "jari telunjuk" dan "jari tengah", dan sentuh dengan jari telunjuk anda terlebih dahulu.

図 5 :人差し指でタッチ
Rajah 5: Sentuh dengan jari telunjuk

Seperti yang ditunjukkan pada skrin, indeks akan menjadi "0". Kemudian sentuh dengan jari tengah anda.

図 6 :中指でタッチ
Rajah 6: Sentuhan jari tengah

Dalam keadaan ini, anda menyentuh dengan dua jari, jadi dua maklumat dipaparkan. Indeks yang disentuh dengan jari tengah ialah "1".

Mari angkat jari telunjuk kami di sini. Kemudian maklumat sentuhan akan kelihatan seperti berikut.

図 7 :人差し指を放す
Rajah 7: Lepaskan jari telunjuk anda

Seperti yang anda perhatikan sekarang, indeks maklumat yang anda sentuh dengan jari tengah anda ialah "0". Jika anda menguruskan aksara mengikut indeks apabila anda mengalihkannya, operasi di atas akan membawa kepada tindakan berikut.

・ Gerakkan aksara "A" dengan jari telunjuk anda

・ Pindahkan aksara "B" dengan jari tengah dalam keadaan itu.

・ Lepaskan jari telunjuk semasa menggerakkan watak dengan jari tengah

・ Watak yang dikawal oleh jari tengah tiba-tiba beralih kepada "A"

Fenomena lain ialah jika anda berulang kali melepaskan atau menyentuh salah satu daripada dua jari semasa menyentuhnya, teks lukisan maklumat sentuhan pertama mungkin berkelip. Ini kerana jari kedua mengganggu indeks "0" sebaik sahaja anda menyentuh atau melepaskannya.

Seperti yang dinyatakan di atas, indeks dan susunan maklumat sentuhan apabila berbilang sentuhan tidak sepadan dengan susunan di mana ia disentuh. Oleh itu, jika anda ingin melakukan sebarang operasi, jangan menguruskannya dalam indeks TouchCollection.

Apa yang perlu diuruskan ialah struktur "TouchLocation" mempunyai sifat "Id", dan Id ditulis semula dengan nilai baharu setiap kali disentuh, tetapi hubungan antara titik sentuhan dan ID dijamin semasa menyentuh, jadi kami akan menguruskannya.

Sudah tentu, ini tidak bermakna anda perlu menguruskannya dengan ID, dan dalam beberapa kes, kedudukan sentuhan sahaja mencukupi. Sebagai contoh, jika anda hanya menyentuh butang pada skrin, anda boleh menentukan bahawa anda menekan butang dengan menyemak kedudukan sentuh tanpa mengira ID. Walau bagaimanapun, apabila termasuk pemprosesan seret, kedudukan sentiasa berubah, jadi saya fikir ia masih harus ditentukan oleh ID.

Program - Perkara yang perlu diingat apabila memperoleh maklumat sentuh2 (bilangan maklumat sentuhan diperolehi)

Walaupun ia tidak termasuk dalam program artikel, sampel menarik rentetan "GetMaxTouchCount" di bahagian bawah skrin dan "bilangan maksimum maklumat sentuhan yang diperoleh pada masa yang sama". Ini telah memaparkan bilangan maksimum maklumat sentuhan yang diperoleh melalui kaedah "TouchPanel.GetState" pada masa lalu, tetapi dalam mesin ujian ini, sifat "TouchPanelCapabilities.MaximumTouchCount" ialah 4, jadi nilai maksimum yang dipaparkan di sini biasanya ialah 4. Jika anda meletakkan lima jari di atasnya, ia masih akan menjadi 4.

図 8 :5 本の指を置いたときの数値
Rajah 8: Nombor lima jari

Mari kita lakukan sedikit percubaan. Cuba ulangi panel sentuh dengan pelbagai jari pada kelajuan tinggi. Ia bergantung kepada mesin ujian, tetapi bilangannya mungkin melebihi 4 sebelum anda mengetahuinya.

図 9 :GetMaxTouchCount が 4 を超えている
Rajah 9: GetMaxTouchCount lebih besar daripada 4

Malah, maklumat sentuhan yang diperoleh oleh kaedah "TouchPanel.GetState" bukanlah maklumat sentuhan pada saat memanggil kaedah "TouchPanel.GetState", tetapi sebaik sahaja anda menyentuhnya dan sebaik sahaja anda melepaskannya dari masa kemas kini terakhir dicache. Oleh itu, walaupun sehingga empat sentuhan dapat dikesan pada masa yang sama, menyentuh jari yang sama sekali lagi dianggap sebagai sentuhan yang berasingan, jadi lebih banyak maklumat sentuhan boleh diperolehi daripada TouchPanelCapabilities.MaximumTouchCount.

Oleh itu, walaupun TouchPanelCapabilities.MaximumTouchCount adalah 4, jika bilangan unsur tatasusunan data berkaitan sentuhan ditetapkan oleh 4, ralat overage indeks mungkin berlaku bergantung pada kaedah pemprosesan.

Dengan cara ini, dengan bantuan XNA Game Studio, nilai maksimum harta TouchCollection.Count digambarkan sebagai "8", jadi jika anda ingin membetulkan bilangan elemen dalam tatasusunan, anda harus menetapkan bilangan elemen kepada sekurang-kurangnya 8. (Jika anda berfikir tentang peningkatan versi masa depan, anda mungkin mahu memasukkan klausa pengawal supaya indeks tidak berakhir.)

Ringkasan sampel ini

Kali ini, kami mengkaji pelbagai parameter untuk maklumat yang diperoleh daripada pelbagai sentuhan. Kami juga mengesahkan bahawa terdapat beberapa perkara yang perlu diingat semasa memperoleh maklumat panel sentuh. Berdasarkan pengetahuan ini, saya ingin menerangkan sampel yang sebenarnya menggunakan pelbagai sentuhan.