Сенсорна взаємодія під час розробки ігор для Windows Phone 7 Part 2 Мультидотик

Сторінка оновлюється :
Дата створення сторінки :

Програмування! - 2.Спробуйте мультидотик

Про цей зразок

Тут хотілося б пояснити програму реалізації мультитач-введення. У Windows Phone 7 мультисенсорне введення через сенсорну панель є одним з найважливіших елементів для введення користувачем. Це пояснюється тим, що, на відміну від Windows і Xbox 360, основним інтерфейсом введення є «сенсорна панель». Можуть бути телефони Windows з клавіатурами, але, звичайно, вони не завжди їх мають. Отже, щоб гра працювала на будь-якому Windows Phone, вона повинна бути сенсорною.

Якщо ви обмежите сенсорну панель лише "одним дотиком", типи ігор, які можна зробити, неминуче будуть обмежені, коли справа доходить до створення ігор. Подумайте про портативну ігрову приставку (можна залишити її нерухомою). Більшість ігрових консолей вимагають, щоб ви тримали ігровий контролер (або власне консоль) обома руками і натискали кілька кнопок одночасно.

Windows Phone 7 не має такої кількості кнопок, як ігрові контролери, і він не обов'язково має клавіатуру. Тому віртуальні клавіші і кнопки можуть розміщуватися на екрані, а при їх натисканні це незручно тим, що їх не можна натиснути одночасно тільки одним дотиком.

Звичайно, на додаток до прикладу віртуальної кнопки вище, мультитач необхідний для ігор, де кілька людей керують одним екраном, наприклад, «щипати і розтягувати (переміщати дві точки ближче або далі один від одного)», що є звичайним явищем в мультитач.

До речі, введення довге, але в цій вибірці хотілося б обзавестися мультитач інформацією за допомогою класу, присвяченого сенсорним панелям. Цікаво створити зразок, в який можна грати мультитачем раптово, але спочатку хотілося б дізнатися, яку інформацію можна отримати за допомогою мультитач. Є деякі звички, тому, знаючи їх спочатку, ви можете скоротити час, витрачений на розслідування причини, наприклад, коли вона погано працює в програмуванні пізніше.

Цілі даного зразка програми

Відображати і підтверджувати інформацію при виконанні мультитач.

図 1 :タッチしたときにタッチ情報がテキストで表示される
Рисунок 1: Сенсорна інформація відображається у вигляді тексту при дотику

Програма - оголошення полів

Поля повинні бути позначені як TouchPanelМожливості Структура та Структура TouchCollection.

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

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

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

"Структура можливостей сенсорної панелі" - це структура, яка може мати функції самої сенсорної панелі в якості параметрів. Він використовується для перевірки того, чи можна використовувати сенсорну панель під час оновлення.

Структура TouchCollection містить список відомостей про поточний стан сенсорного стану. Якщо виявлено кілька дотиків, можна отримати кілька структур TouchLocation. Про це трохи пізніше.

Програма - Завантаження шрифтів

Перш ніж малювати текст на екрані, додайте визначення шрифту до свого контент-проекту та завантажте його за допомогою методу Game.LoadContent. Це не має прямого відношення до сенсорних панелей, тому докладне пояснення опущу.

図 2 :コンテンツプロジェクトに「Font.spritefont」を追加しておく
Рисунок 2: Додайте "Font.spritefont" до свого контент-проекту

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

Програма - Отримання інформації на сенсорній панелі

Отримайте інформацію про сенсорну панель у методі Game.Update.

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

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

Можна викликати метод «TouchPanel.GetCapabilities», щоб отримати інформацію про функції сенсорної панелі. Існує два типи інформації, яку можна придбати: «Чи можна використовувати сенсорну панель?» і «Максимальна кількість точок дотику, які може отримати сенсорна панель». Жоден з них не змінюється під час гри, тому я думаю, що немає ніяких проблем, якщо ви отримаєте його за методом Game.Initialize, але в подальшому з'являться пристрої, здатні видалити сенсорну панель (сенсорна панель, яку можна підключити до USB або власне пристроїв, відмінних від Windows Phone), і це описано в методі Update.

Також немає необхідності перевіряти, чи можна використовувати сенсорну панель, оскільки її завжди можна використовувати на Windows Phone 7, але при спільному використанні коду з Windows і Xbox 360 це обладнання не вимагає інтерфейсів введення і його потрібно перевірити.

Якщо ви можете підтвердити, що сенсорна панель доступна у властивості "TouchPanelCapabilities.IsConnected", метод "TouchPanel.GetState" отримує поточний стан дотику.

Спочатку деяка операція обробки виконується після отримання сенсорної інформації, але в цьому зразку інформація тільки відображається, тому подальша обробка в Game.Update не проводиться.

Програма - Отримайте максимальну кількість точок дотику, які ви можете отримати

Максимальна кількість точок дотику, які можна отримати, приблизно фіксована, тому не часто потрібно отримувати їх під час гри, але ви можете отримати максимальну кількість точок дотику, які можна отримати з властивості TouchPanelCapabilities.MaximumTouchCount. Наприклад, якщо властивість MaximumTouchCount дорівнює «4», ви не можете отримати інформацію про п'яту позицію, торкнувшись сенсорної панелі п'ятьма пальцями.

Кількість придбань для смартфона «HTC 7 Trophy», використовуваного в даному зразку, склало «4». (До речі, XNA Game Studio 4.0 визначається як завжди повертати 4.) Специфікація Windows Phone 7 говорить, що вона становить більше 4 балів, тому вона не повертається менше 4.)

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

図 3 :TouchPanelCapabilities.MaximumTouchCount プロパティの取得数
Рисунок 3: Сенсорна панельМожливості.Максимальна кількість пошукових властивостей TouchCount

Програма - Отримання сенсорної інформації

Отримана структура TouchCollection містить інформацію про кілька дотиків. Наприклад, якщо торкатися двома пальцями, то зазвичай він містить два дотики.

Кількість сенсорної інформації можна отримати у властивості TouchCollection.Count. Сенсорна інформація багаторазово відображається в заяві for стільки разів, скільки вона отримана. Спочатку немає проблем циклічно з форахом, але оскільки ми будемо використовувати індекс масиву (індекс int) у пізнішому поясненні, ми зациклюємо його для.

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

Тепер кожна сенсорна інформація виходить у вигляді структури «TouchLocation». Якщо він циклічний за допомогою for, його можна отримати за допомогою "TouchCollection[index]". (Ви також можете отримати структуру "TouchLocation" безпосередньо у форах.)

Наступні чотири типи інформації можна отримати зі структури "TouchLocation", і кожна інформація відображається у вибірці.

Коли ви дійсно запускаєте його, інформація про дотик відображається, як показано нижче. Так як ви торкаєтеся трьома пальцями, то можете побачити три дотику. До речі, якщо ви торкнетеся п'ятьма пальцями, то побачите тільки до чотирьох. (Тому що максимальна кількість придбань - 4)

図 4 :3 本の指でタッチしているところ
Малюнок 4: Дотик трьома пальцями

Програма - На що слід звернути увагу при отриманні сенсорної інформації 1 (індекс та ідентифікатор)

Я вже згадував вище, що є речі, про які слід пам'ятати, маючи справу з сенсорною інформацією, але перший - це "індекс" і "ID". Індекс просто відноситься до індексу масиву.

Я думаю, що легше зрозуміти, якщо ви спробуєте його на реальній машині, ніж пояснити це письмово. Наприклад, скажімо, ви оперуєте двома пальцями, «вказівним» і «середнім пальцем», і торкаєтеся спочатку вказівним пальцем.

図 5 :人差し指でタッチ
Рисунок 5: Дотик вказівним пальцем

Як показано на екрані, індекс буде «0». Потім доторкніться до нього середнім пальцем.

図 6 :中指でタッチ
Малюнок 6: Середній дотик пальцем

У такому стані ви торкаєтеся двома пальцями, тому виводиться дві частини інформації. Вказівний, зачеплений середнім пальцем, дорівнює «1».

Давайте піднімемо сюди вказівний палець. Тоді сенсорна інформація буде виглядати наступним чином.

図 7 :人差し指を放す
Малюнок 7: Відпустіть вказівний палець

Як ви вже могли помітити, індекс інформації, до якої ви торкаєтеся середнім пальцем, - «0». Якщо ви керуєте символом за індексом під час його переміщення, операція, наведена вище, призведе до наступних дій.

・ Рухайте символ «А» вказівним пальцем

・ Перемістіть символ «В» середнім пальцем у такому стані.

・ Відпустіть вказівний палець під час переміщення символу середнім пальцем

・ Персонаж, керований середнім пальцем, раптово перемикається на «А»

Ще одне явище полягає в тому, що якщо ви неодноразово відпускаєте або торкаєтеся одного з двох пальців, торкаючись їх, текст малювання першої сенсорної інформації може мерехтіти. Це пояснюється тим, що другий палець перериває індекс «0» в той момент, коли ви торкаєтеся або відпускаєте його.

Як вже було сказано вище, індекс і порядок сенсорної інформації при мультитач не відповідають тому порядку, в якому вони торкаються. Тому, якщо ви хочете виконувати будь-які операції, не керуйте ними в індексі TouchCollection.

Чим слід керувати, так це тим, що структура «TouchLocation» має властивість «Id», а Id переписується з новим значенням кожен раз при дотику, але зв'язок між точкою дотику і ID гарантована при дотику, тому ми будемо нею керувати.

Звичайно, це не означає, що вам доведеться керувати ним за ідентифікатором, а в деяких випадках достатньо одного лише положення дотику. Наприклад, якщо просто торкнутися кнопки на екрані, можна визначити, що ви натиснули кнопку, перевіривши положення дотику незалежно від ID. Однак при включенні перетягування позиція завжди змінюється, тому я думаю, що вона все одно повинна визначатися ID.

Програма - Що потрібно пам'ятати при отриманні сенсорної інформації 2 (кількість придбаної сенсорної інформації)

Хоча він і не входить в програму статті, зразок малює рядок «GetMaxTouchCount» внизу екрану і «максимальна кількість сенсорної інформації, отриманої одночасно». Це відображало максимальну кількість сенсорної інформації, отриманої методом "TouchPanel.GetState" в минулому, але в цій тестовій машині властивість "TouchPanelCapabilities.MaximumTouchCount" дорівнює 4, тому максимальне значення, що відображається тут, зазвичай має бути 4. Якщо покласти на нього п'ять пальців, то все одно буде 4.

図 8 :5 本の指を置いたときの数値
Рисунок 8: П'ятипальцеве число

Давайте проведемо невеликий експеримент. Спробуйте повторити сенсорну панель декількома пальцями на високій швидкості. Це залежить від тестової машини, але кількість може перевищувати 4, перш ніж ви її дізнаєтеся.

図 9 :GetMaxTouchCount が 4 を超えている
Рисунок 9: GetMaxTouchCount більше 4

Насправді, сенсорна інформація, отримана методом "TouchPanel.GetState", - це не сенсорна інформація в момент виклику методу "TouchPanel.GetState", а момент, коли ви доторкнетеся до неї і момент, коли ви звільните її від останнього часу оновлення, кешуються. Тому, незважаючи на те, що одночасно можна виявити до чотирьох дотиків, дотик до одного і того ж пальця знову розглядається як окремий дотик, тому можна отримати більше сенсорної інформації, ніж TouchPanelCapabilities.MaximumTouchCount.

Тому, навіть якщо TouchPanelCapabilities.MaximumTouchCount дорівнює 4, якщо кількість елементів масиву даних, пов'язаних з дотиком, зафіксовано на 4, в залежності від способу обробки може виникнути помилка перевитрати індексу.

До речі, за допомогою XNA Game Studio максимальне значення властивості TouchCollection.Count описується як «8», тому якщо ви хочете зафіксувати кількість елементів в масиві, слід встановити кількість елементів не менше 8. (Якщо ви думаєте про майбутні оновлення версії, ви можете включити застереження про охорону, щоб індекс не перевищував.)

Короткий зміст даного зразка

На цей раз ми розглянули різні параметри інформації, отриманої з мультитача. Ми також підтвердили, що є деякі моменти, про які слід пам'ятати при отриманні інформації про сенсорну панель. На основі цих знань хотілося б пояснити зразок, який насправді використовує мультитач.