觸摸操作在Windows手機7遊戲開發第3部分拖動操作

更新頁 :
頁面創建日期 :

程式設計! - 3. 嘗試移動卡以匹配觸摸

關於此範例

這一次,我想創建一個專業版,將四張卡放在螢幕上,然後將卡片放在您觸摸的位置。 這是程式的多點觸控版本,首先在 Mouse 類中拖動子畫面。 到目前為止,有很多解釋,所以這次我想以程式為中心來解釋它。

此示例程序的目標

同時拖動多點觸控觸摸的多張卡。

図 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; }
}

為了不成為過於複雜的代碼,我們確保卡片類具有三個屬性:觸摸ID、位置和顏色。 沒有具體說明,但「觸摸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, },
};

程式 - 獲取觸摸資訊

在遊戲.更新方法中。 這裡沒有特別的新點,因為它是一個樣例。

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

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

  //   :
  // ここに処理
  //   :
}

程式 - 觸摸時將觸摸ID與卡關聯

在示例程式中,從處理成本的角度來看,順序是相反的,但在這裡解釋它更容易理解,所以我會先解釋它。

首先,在 foreach 中循環訪問檢索到的觸摸集合以獲取每個資訊。

/// タッチ情報の処理を行う
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;
  }
}

檢查「觸摸位置.狀態」屬性,如果為「觸摸位置狀態.Pressed」,則表示這是觸摸的時刻。

由於此示例將卡的ID定義為“0”,則不使用“卡”。 Where(c => c.Id == 0). 在“第一個十一()”中,我搜索了一張 ID 為 0 的卡,並在找到該卡時檢索該卡。 如果未找到,則返回 null。 為了簡化代碼,我們使用 LINQ 調用擴展方法,但如果您關心處理成本,則可以在 for 迴圈中逐個搜索。

找到卡后,將觸摸ID和觸摸位置放在卡片上。

程式 - 觸摸時處理卡,釋放時處理

觸摸時,始終將卡置於拖動狀態,並在釋放時斷開觸摸點與卡之間的關聯。

// 各カードの情報を調べる
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 中循環訪問卡清單,並處理每個卡。 如果ID不是0,則與接觸點關聯,因此繼續處理。

觸摸集合結構提供 FindById 方法,如果存在指定的 ID,則可以獲取觸摸資訊。 Card.Id 屬性不為零,則可以假定它與某個接觸點相關聯,因此嘗試使用 FindById 方法獲取觸摸資訊。

如果 FindById 方法返回 true,則仍處於觸摸狀態,因此從觸摸位置.位置屬性獲取觸摸位置並將其設置為卡類。 如果 FindById 方法返回 false,則釋放觸摸,因此將 Card.ID 設置為 0,以便沒有人觸摸它。

程式 - 繪製卡片

繪圖所需的參數應已在 Card 類中設置,因此沒有特別新內容。

// スプライトの描画準備
spriteBatch.Begin();

// 各カードを描画
foreach (Card card in cards)
{
  spriteBatch.Draw(texture, card.Position, card.Color);
}

// スプライトの一括描画
spriteBatch.End();

此示例摘要

這一次,我嘗試編寫一個圖像程式,使用多點觸控來實際移動遊戲中的物件。 此外,當使用觸摸資訊ID同時拖動多張卡時,我們還可以確保即使鬆開或重新觸摸其他手指,卡的移動也不會發生衝突。

此示例只是一個範例,並且僅執行簡單的處理。 但是,在實際遊戲程式設計中,觸摸屏多點觸控操作的基本部分應該有效,因此請嘗試將其應用於適合您遊戲的多點觸控處理。