Взаимодействия с докосване в разработването на игри за Windows Phone 7 Part 2 Multitouch

Страницата се актуализира :
Дата на създаване на страница :

Програмен! - 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. Информацията за докосване се показва многократно в изявлението за толкова пъти, колкото е получена. Първоначално, няма проблем да се завърти с 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)

Споменах по-горе, че има неща, които трябва да имате предвид, когато се занимавате с информация за докосване, но първата е "индекс" и "ID". Индексът просто се отнася до индекс на масив.

Мисля, че е по-лесно да се разбере, ако го опитате на действителна машина, отколкото да го обясните писмено. Например, да кажем, че работите с два пръста, "показалец" и "среден пръст", и първо докосвате с показалеца си.

図 5 :人差し指でタッチ
Фигура 5: Докосване с показалец

Както е показано на екрана, индексът ще бъде "0". След това го докоснете със средния си пръст.

図 6 :中指でタッチ
Фигура 6: Докосване със среден пръст

В това състояние вие докосвате с два пръста, така че се показват две парчета информация. Показалецът, докоснат със средния пръст, е "1".

Нека вдигнем показалеца си тук. Тогава информацията за докосване ще изглежда по следния начин.

図 7 :人差し指を放す
Фигура 7: Освободете показалеца си

Както може би сте забелязали досега, индексът на информацията, която докосвате със средния си пръст, е "0". Ако управлявате знака по индекс, когато го премествате, операцията по-горе ще доведе до следните действия.

・ Преместете знака "А" с показалеца си

・ Преместете знака "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. (Ако мислите за бъдещи ъпгрейди на версиите, може да искате да включите клауза за защита, така че индексът да не се надмине.)

Резюме на тази извадка

Този път разгледахме различни параметри за информацията, получена от мулти-тъч. Също така потвърдихме, че има някои точки, които трябва да имате предвид, когато придобивате информация за сензорния панел. Въз основа на това знание бих искал да обясня извадка, която всъщност използва мултитъч.