การโต้ตอบแบบสัมผัสในการพัฒนาเกมสําหรับ Windows Phone 7 ส่วนที่ 3 การดําเนินการลาก
โปรแกรม! - 3.ลองย้ายการ์ดไปสัมผัส
เกี่ยวกับตัวอย่างนี้
คราวนี้ฉันต้องการสร้าง progran ที่วางไพ่สี่ใบบนหน้าจอและวางและลากการ์ดไปยังสถานที่ที่พวกเขาสัมผัส นี่เป็นรุ่นมัลติทัชของโปรแกรมที่ลากสไปรท์ด้วยคลาสเมาส์เป็นครั้งแรก จนถึงขณะนี้มีคําอธิบายมากมายดังนั้นคราวนี้ฉันอยากจะอธิบายเกี่ยวกับโปรแกรมเป็นหลัก
เป้าหมายของโปรแกรมตัวอย่างนี้
ลากการ์ดหลายใบพร้อมกันเมื่อคุณสัมผัสด้วยมัลติทัช
รูปที่ 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 ของข้อมูลการสัมผัสการเคลื่อนไหวของการ์ดจะสอดคล้องกันแม้ว่านิ้วอีกใบจะถูกยกขึ้นหรือสัมผัสอีกครั้ง
ตัวอย่างนี้เป็นเพียงตัวอย่างและดําเนินการประมวลผลอย่างง่ายเท่านั้น อย่างไรก็ตามส่วนพื้นฐานของการทํางานแบบมัลติทัชโดยแผงสัมผัสควรครอบคลุมโดยการเขียนโปรแกรมเกมจริงดังนั้นโปรดนําไปใช้กับการประมวลผลแบบมัลติทัชที่เหมาะสมกับเกมของคุณตามนี้