Взаимодействия с докосване в разработването на игри за Windows Phone 7, част 3 Drag операции

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

Програмен! - 3.Опитайте да преместите картата на допир

За тази проба

Този път бих искал да създам progran, който поставя четири карти на екрана и поставя и плъзга картите до мястото, където са докоснати. Това е мултитъч версия на програмата, която първо влачи спрайт с класа на мишката. Досега имаше много обяснения, така че този път бих искал да обясня основно за програмата.

Цели на тази примерна програма

Плъзнете няколко карти едновременно с мултитъч.

図 1 :マルチタッチによるドラッグ操作
Фигура 1: Операция за плъзгане с няколко докосвания

Програма - Класове карти

Когато става въпрос за мултитъч, става необходимо да има множество обекти, така че тук бих искал да създам клас "Карта" със спрайт, който да бъде преместен като "карта".

/// <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, позиция и цвят. Няма конкретен елемент, който да навлезе в подробности, но "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, },
};

Програматик - Получаване на информация за докосване

Вътре в метода 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()" за търсене на карта с ID 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();

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

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

Тази проба е само проба и се извършва само проста обработка. Въпреки това, основната част от мултитъч операцията от сензорния панел трябва да бъде покрита от действителното програмиране на играта, така че, моля, приложете я към мултитъч обработка, която отговаря на вашата игра въз основа на това.