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

Страница обновлена :
Дата создания страницы :

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

Об этом примере

Здесь я хотел бы объяснить программу для реализации мультитач-ввода. В Windows Phone 7 мультисенсорный ввод через сенсорную панель является одним из наиболее важных элементов для пользовательского ввода. Это связано с тем, что, в отличие от Windows и Xbox 360, основным входным интерфейсом является «сенсорная панель». Могут быть телефоны Windows с клавиатурами, но, конечно, они не всегда их имеют. Итак, для того, чтобы игра работала на любом Windows Phone, она должна быть сенсорной.

Если вы ограничите сенсорную панель только «одним касанием», типы игр, которые могут быть сделаны, неизбежно будут ограничены, когда дело доходит до создания игр. Подумайте о портативной игровой консоли (вы можете оставить ее неподвижной). Большинство игровых консолей требуют, чтобы вы держали игровой контроллер (или фактическую консоль) обеими руками и нажимали несколько кнопок одновременно.

Windows Phone 7 не имеет столько кнопок, сколько игровые контроллеры, и у него не обязательно есть клавиатура. Поэтому виртуальные клавиши и кнопки могут быть размещены на экране, и при их нажатии это неудобно, поскольку их нельзя нажать одновременно одним касанием.

Конечно, в дополнение к приведенному выше примеру виртуальной кнопки, мультитач необходим для игр, в которых несколько человек управляют одним экраном, например, «сжимать и растягивать (перемещаться на две точки ближе или дальше друг от друга)», что распространено в мультитач.

Кстати, введение длинное, но в этом образце хотелось бы получить мультисенсорную информацию с помощью класса, посвященного сенсорным панелям. Интересно создать образец, который можно воспроизводить с помощью мультитач внезапно, но сначала я хотел бы узнать, какую информацию можно получить с помощью мультитач. Есть некоторые привычки, поэтому, зная их в первую очередь, вы можете сократить время, затрачиваемое на исследование причины, например, когда это плохо работает в программировании позже.

Цели этой примерной программы

Отображение и подтверждение информации при выполнении мультитач.

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

Программа - Декларирование полей

Поля должны быть помечены как TouchPanelCapabilities Structure и TouchCollection Structure.

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

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

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

«Структура TouchPanelCapabilities» — это структура, которая может иметь функции самой сенсорной панели в качестве параметров. Он используется для проверки того, можно ли использовать сенсорную панель во время обновления.

Структура 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: TouchPanelCapabilities.MaximumTouchCount Количество извлечений свойств

Программа - Получение сенсорной информации

Полученная структура TouchCollection содержит несколько сенсорных сведений. Например, если вы касаетесь двумя пальцами, он обычно содержит два касания.

Количество сенсорной информации можно получить в свойстве TouchCollection.Count. Сенсорная информация многократно отображается в операторе for столько раз, сколько она получена. Первоначально не было проблем с циклом с foreach, но поскольку мы будем использовать индекс массива (int index) в более позднем объяснении, мы зацикливаем его с 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);
}

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

Следующие четыре типа информации могут быть получены из структуры "TouchLocation", и каждая информация отображается в образце.

Когда вы фактически запускаете его, сенсорная информация отображается, как показано ниже. Поскольку вы касаетесь тремя пальцами, вы можете увидеть три касания. Кстати, если вы коснетесь пятью пальцами, вы увидите только до четырех. (Потому что максимальное количество приобретений составляет 4)

図 4 :3 本の指でタッチしているところ
Рисунок 4: Прикосновение тремя пальцами

Программа - На что следует обратить внимание при получении сенсорной информации 1 (индекс и идентификатор)

Я упоминал выше, что есть вещи, которые следует иметь в виду при работе с сенсорной информацией, но первое - это «индекс» и «ID». Индекс просто ссылается на индекс массива.

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

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

Как показано на экране, индекс будет «0». Затем прикоснитесь к нему средним пальцем.

図 6 :中指でタッチ
Рисунок 6: Прикосновение к среднему пальцу

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

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

図 7 :人差し指を放す
Рисунок 7: Отпустите указательный палец

Как вы, возможно, уже заметили, индекс информации, к которой вы прикасаетесь средним пальцем, равен «0». Если вы управляете символом по индексу при его перемещении, приведенная выше операция приведет к следующим действиям.

・ Переместите символ "A" указательным пальцем

・ Переместите символ «B» средним пальцем в этом состоянии.

・ Отпустите указательный палец, перемещая символ средним пальцем

・ Персонаж, управляемый средним пальцем, внезапно переключается на «А»

Другое явление заключается в том, что если вы неоднократно отпускаете или касаетесь одного из двух пальцев при прикосновении к ним, текст рисунка первой сенсорной информации может мерцать. Это связано с тем, что второй палец прерывает индекс «0» в тот момент, когда вы касаетесь или отпускаете его.

Как уже упоминалось выше, индекс и порядок касания информации при мультитач не совпадают с порядком, в котором они затрагиваются. Поэтому, если вы хотите выполнить какие-либо операции, не управляйте ими в индексе TouchCollection.

Что следует управлять, так это тем, что структура «TouchLocation» имеет свойство «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. (Если вы думаете о будущих обновлениях версий, вы можете включить предложение guard, чтобы индекс не переходил.)

Краткое изложение этого примера

На этот раз мы изучили различные параметры информации, полученной от мультитач. Мы также подтвердили, что есть некоторые моменты, которые следует иметь в виду при получении информации о сенсорной панели. Основываясь на этих знаниях, я хотел бы объяснить пример, который на самом деле использует мультитач.