การโต้ตอบแบบสัมผัสในการพัฒนาเกมสําหรับ Windows Phone 7 ส่วนที่ 3 การดําเนินการลาก

ปรับปรุงหน้า :
วันที่สร้างเพจ :

โปรแกรม! - 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" เพื่อตรวจสอบว่าจุดสัมผัสใดเชื่อมโยงอยู่

โปรแกรม - ประกาศสาขา

ไม่มีอะไรใหม่เกี่ยวกับเรื่องนี้นอกเหนือจากการมีคลาสการ์ดมากมายเพื่อเก็บข้อมูลบัตร คราวนี้มันเหมือนกับการประยุกต์ใช้ตัวอย่างก่อนหน้านี้ ฉันทําการ์ดสี่ใบแต่ละใบมีสีต่างกันเพื่อให้คุณสามารถเห็นความแตกต่างเมื่อวาด

/// <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 สัมผัสไปยังบัตรเมื่อสัมผัส

ในโปรแกรมตัวอย่างคําสั่งซื้อจะกลับจากมุมมองของต้นทุนการประมวลผล แต่จะเข้าใจได้ง่ายขึ้นหากคุณอธิบายจากที่นี่ดังนั้นฉันจะอธิบายเรื่องนี้ก่อน

ขั้นแรกให้วนรอบ 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" คือช่วงเวลาที่คุณสัมผัส

ในตัวอย่างนี้หาก ID ของบัตรเป็น "0" จะมีการกําหนดว่าไม่ได้ใช้ดังนั้น "การ์ด โดยที่(c => c.Id == 0) FirstOrDefault()" เพื่อค้นหาบัตรที่มี ID 0 จากรายการบัตรและดึงบัตรนั้นหากพบ หากไม่พบ null จะถูกส่งกลับ ที่นี่วิธีการขยายจะถูกเรียกโดย LINQ เพื่อลดความซับซ้อนของรหัส แต่ถ้าคุณกังวลเกี่ยวกับค่าใช้จ่ายในการประมวลผลคุณสามารถค้นหาได้ทีละรายการด้วย a สําหรับลูป.

เมื่อคุณพบบัตรให้ตั้งค่า Touch 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 รหัสจะเชื่อมโยงกับจุดสัมผัสและกระบวนการจะดําเนินต่อไป

โครงสร้าง TouchCollection มีวิธีการ "FindById" ที่ช่วยให้คุณสามารถดึงข้อมูลการสัมผัสสําหรับ ID ที่ระบุหากมีอยู่ หากคุณสมบัติ Card.Id ไม่ใช่ 0 เราสามารถสันนิษฐานได้ว่าเกี่ยวข้องกับจุดสัมผัสบางอย่างดังนั้นเราจะพยายามรับข้อมูลการสัมผัสด้วยวิธี FindById

ถ้าวิธีการ FindById ส่งกลับจริง ก็ยังคงอยู่ในสถานะสัมผัส ดังนั้นรับตําแหน่งสัมผัสจากคุณสมบัติ TouchLocation.Position และตั้งค่าในคลาสบัตร หากเมธอด FindById ส่งกลับค่าเท็จ การสัมผัสจะถูกปล่อยออกมา ดังนั้นให้ตั้งค่า Card.ID เป็น 0 และตั้งค่าเป็นไม่มีใครสัมผัส

โปรแกรม - การ์ดวาดรูป

พารามิเตอร์ที่จําเป็นสําหรับการวาดภาพควรตั้งค่าเป็นคลาสการ์ดอยู่แล้วดังนั้นจึงไม่มีอะไรใหม่

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

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

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

สรุปตัวอย่างนี้

คราวนี้ฉันพยายามสร้างโปรแกรมรูปภาพที่ใช้มัลติทัชเพื่อย้ายวัตถุในเกมจริงๆ นอกจากนี้เรายังสังเกตว่าเมื่อลากการ์ดหลายใบพร้อมกันโดยใช้ ID ของข้อมูลการสัมผัสการเคลื่อนไหวของการ์ดจะสอดคล้องกันแม้ว่านิ้วอีกใบจะถูกยกขึ้นหรือสัมผัสอีกครั้ง

ตัวอย่างนี้เป็นเพียงตัวอย่างและดําเนินการประมวลผลอย่างง่ายเท่านั้น อย่างไรก็ตามส่วนพื้นฐานของการทํางานแบบมัลติทัชโดยแผงสัมผัสควรครอบคลุมโดยการเขียนโปรแกรมเกมจริงดังนั้นโปรดนําไปใช้กับการประมวลผลแบบมัลติทัชที่เหมาะสมกับเกมของคุณตามนี้