Сенсорные взаимодействия в разработке игр для Windows Phone 7, часть 3 Операции перетаскивания
Программирование! - 3.Попробуйте переместить карту на ощупь
Об этом примере
На этот раз я хотел бы создать програн, который помещает четыре карты на экран и помещает и перетаскивает карты в то место, где они касаются. Это мультисенсорная версия программы, которая сначала перетащила спрайт с классом Mouse. До сих пор было много объяснений, поэтому на этот раз я хотел бы рассказать в основном о программе.
Цели этой примерной программы
Перетаскивайте несколько карт одновременно при касании с помощью мультитач.
Рисунок 1: Операция мультисенсорного перетаскивания
Программа - Карточные классы
Когда дело доходит до мультитач, становится необходимым иметь несколько объектов, поэтому здесь я хотел бы создать класс «Card» со спрайтом, который будет перемещен как «карта».
<summary>
ドラッグできるカード
</summary>
public class Card
{
<summary>
タッチ ID
</summary>
public int Id { get; set; }
<summary>
カードの位置
</summary>
public Vector2 Position { get; set; }
<summary>
カードの色
</summary>
public Color Color { get; set; }
}
Чтобы не усложнять код, класс карты имеет три свойства: touch ID, position и color. Нет конкретного элемента, чтобы вдаваться в подробности, но «Touch ID» используется для проверки того, какая точка соприкосновения связана.
Программа - Декларирование полей
В этом нет ничего нового, кроме наличия массива классов карт для хранения информации о карте. На этот раз это похоже на применение предыдущих образцов. Я сделал четыре карты, каждая из которых имеет свой цвет, чтобы вы могли видеть разницу при рисовании.
<summary>
テクスチャー
</summary>
Texture2D texture;
<summary>
カードの一覧(4 枚分)
</summary>
Card[] cards = new Card[]
{
new Card { Color = Color.White, },
new Card { Color = Color.Yellow, },
new Card { Color = Color.Fuchsia, },
new Card { Color = Color.Aqua, },
};
Programmatic - Получение сенсорной информации
Внутри метода Game.Update. Эта область шаблонна, поэтому в ней нет ничего особенно нового.
// タッチパネルの機能情報を取得
TouchPanelCapabilities capabilities = TouchPanel.GetCapabilities();
// タッチパネルが使用可能であるかチェック
if (capabilities.IsConnected)
{
// 現在のタッチパネルの入力情報を取得
TouchCollection touches = TouchPanel.GetState();
// :
// ここに処理
// :
}
Программа - Связывание сенсорного идентификатора с картой при касании
В примере программы порядок обратный с точки зрения стоимости обработки, но его легче понять, если объяснить его отсюда, поэтому я объясню это первым.
Сначала выполните цикл через приобретенный TouchCollection, чтобы получить каждую часть информации.
タッチ情報の処理を行う
foreach (TouchLocation tl in touches)
{
// タッチ状態を調べる
switch (tl.State)
{
case TouchLocationState.Pressed:
// タッチされた瞬間は空いているカードを検索して紐づける
Card card = cards.Where(c => c.Id == 0).FirstOrDefault();
if (card != null)
{
card.Id = tl.Id;
card.Position = tl.Position;
}
break;
}
}
Проверьте свойство "TouchLocation.State", чтобы указать, что "TouchLocationState.Pressed" - это момент, когда вы коснулись его.
В этом примере, если идентификатор карты равен «0», он определяется как не используемый, то есть «карты». Где(c = > c.Id == 0). FirstOrDefault()" для поиска карты с идентификатором 0 из списка карт и извлечения этой карты, если она найдена. Если значение не найдено, возвращается значение null. Здесь методы расширения вызываются LINQ для упрощения кода, но если вас беспокоят затраты на обработку, вы можете искать их один за другим с помощью цикла for.
Когда вы найдете карту, установите сенсорный идентификатор и положение касания на карте.
Программа - обработка карт во время касания и при их выпуске
Всегда держите карту в состоянии перетаскивания, пока вы прикасаетесь к ней, и когда вы отпустите ее, она будет отключена от точки касания к карте.
// 各カードの情報を調べる
foreach (Card card in cards)
{
if (card.Id != 0)
{
// 紐づくタッチ情報がまだ存在するか ID で検索
TouchLocation tl;
if (touches.FindById(card.Id, out tl) == true)
{
// まだタッチされている場合は位置情報取得
card.Position = tl.Position;
}
else
{
// すでにタッチ情報がなかったら紐付を外す
card.Id = 0;
}
}
}
Завяжите список карт с помощью foreach и обработайте каждую карту. Если идентификатор отличается от 0, он связывается с точкой соприкосновения, и процесс продолжается.
Структура TouchCollection предоставляет метод "FindById", который позволяет получить информацию о касании для указанного идентификатора, если таковой существует. Если свойство Card.Id не равно 0, можно предположить, что оно связано с какой-то точкой касания, поэтому попробуем получить информацию о касании с помощью метода FindById.
Если метод FindById возвращает значение true, он все еще находится в состоянии касания, поэтому получите положение касания из свойства TouchLocation.Position и задайте его в классе карты. Если метод FindById возвращает значение false, касание отпускается, поэтому установите для Card.ID значение 0 и установите его так, как никто не прикасается к нему.
Программа - Рисование карт
Параметры, необходимые для рисования, уже должны быть установлены в класс Card, поэтому в этом нет ничего нового.
// スプライトの描画準備
spriteBatch.Begin();
// 各カードを描画
foreach (Card card in cards)
{
spriteBatch.Draw(texture, card.Position, card.Color);
}
// スプライトの一括描画
spriteBatch.End();
Краткое изложение этого примера
На этот раз я попытался создать программу для создания изображений, которая использует мультитач для фактического перемещения объектов в игре. Мы также заметили, что когда несколько карт перетаскивались одновременно, используя идентификатор сенсорной информации, движение карт было последовательным, даже если другой палец был поднят или затронут снова.
Этот образец является просто образцом, и выполняется только простая обработка. Тем не менее, основная часть работы multi-touch с помощью сенсорной панели должна быть покрыта фактическим программированием игры, поэтому, пожалуйста, примените ее к мультитач-обработке, которая подходит для вашей игры на основе этого.