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

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

โปรแกรม! - 2. ลองใช้มัลติทัช

เกี่ยวกับตัวอย่างนี้

ที่นี่ฉันต้องการอธิบายโปรแกรมสําหรับการตระหนักถึงการป้อนข้อมูลแบบมัลติทัช ใน Windows Phone 7 การป้อนข้อมูลแบบมัลติทัชผ่านแผงสัมผัสเป็นหนึ่งในรายการที่สําคัญที่สุดสําหรับการป้อนข้อมูลของผู้ใช้ นี่เป็นเพราะไม่เหมือนกับ Windows และ Xbox 360 อินเทอร์เฟซอินพุตหลักคือ "หน้าจอสัมผัส" อาจมีโทรศัพท์ Windows ที่มีแป้นพิมพ์ แต่แน่นอนว่าพวกเขาไม่ได้มีพวกเขาเสมอไป ดังนั้นเพื่อให้เกมทํางานบน Windows Phone ใด ๆ ได้จะต้องมีความสามารถในการสัมผัส

หากคุณ จํากัด หน้าจอสัมผัสไว้ที่ "สัมผัสเดียว" เท่านั้นประเภทของเกมที่สามารถทําได้จะถูก จํากัด อย่างหลีกเลี่ยงไม่ได้เมื่อพูดถึงการสร้างเกม ลองนึกถึงเครื่องเล่นเกมมือถือ (คุณสามารถทิ้งไว้นิ่ง ๆ ได้) คอนโซลเกมส่วนใหญ่กําหนดให้คุณต้องถือตัวควบคุมเกม (หรือคอนโซลจริง) ด้วยมือทั้งสองข้างแล้วกดปุ่มหลายปุ่มพร้อมกัน

Windows Phone 7 ไม่มีปุ่มมากเท่ากับตัวควบคุมเกม และไม่จําเป็นต้องมีแป้นพิมพ์ ดังนั้นปุ่มและปุ่มเสมือนอาจถูกวางไว้บนหน้าจอและเมื่อกดมันไม่สะดวกเพราะไม่สามารถกดพร้อมกันได้ด้วยการสัมผัสเพียงครั้งเดียว

แน่นอนว่านอกเหนือจากตัวอย่างปุ่มเสมือนด้านบนมัลติทัชเป็นสิ่งจําเป็นสําหรับเกมที่หลายคนใช้งานหน้าจอเดียวเช่น "หยิกและยืด (ย้ายสองจุดใกล้หรือไกลออกไป)" ซึ่งเป็นเรื่องปกติในมัลติทัช

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

เป้าหมายของโปรแกรมตัวอย่างนี้

แสดงและยืนยันข้อมูลเมื่อดําเนินการมัลติทัช

図 1 :タッチしたときにタッチ情報がテキストで表示される
รูปที่ 1: ข้อมูลการสัมผัสจะแสดงเป็นข้อความเมื่อสัมผัส

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

ฟิลด์ต้องมีป้ายกํากับว่า โครงสร้าง TouchPanelCapabilities และโครงสร้าง TouchCollection

/// <summary>
///  スプライトでテキストを描画するためのフォント
/// </summary>
SpriteFont font;

/// <summary>
///  タッチパネルの機能情報
/// </summary>
TouchPanelCapabilities capabilities;

/// <summary>
///  取得したタッチ情報の一覧
/// </summary>
TouchCollection touches;

"โครงสร้าง TouchPanelCapabilities" เป็นโครงสร้างที่สามารถมีฟังก์ชั่นของหน้าจอสัมผัสเป็นพารามิเตอร์ได้ ใช้เพื่อตรวจสอบว่าสามารถใช้แผงสัมผัสระหว่างการอัปเดตได้หรือไม่

โครงสร้าง TouchCollection ประกอบด้วยรายการข้อมูลเกี่ยวกับสถานะที่สัมผัสในปัจจุบัน หากตรวจพบการสัมผัสหลายครั้ง จะสามารถเรียกข้อมูล "โครงสร้าง TouchLocation" หลายรายการได้ เพิ่มเติมเกี่ยวกับที่ในภายหลัง

โปรแกรม - กําลังโหลดแบบอักษร

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

図 2 :コンテンツプロジェクトに「Font.spritefont」を追加しておく
รูปที่ 2: เพิ่ม "Font.spritefont" ลงในโปรเจ็กต์เนื้อหาของคุณ

// フォントをコンテンツパイプラインから読み込む
font = Content.Load<SpriteFont>("Font");

โปรแกรม - รับข้อมูลแผงสัมผัส

รับข้อมูลแผงสัมผัสภายในวิธี Game.Update

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

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

คุณสามารถเรียกวิธีการ "TouchPanel.GetCapabilities" เพื่อรับข้อมูลการทํางานของแผงสัมผัส มีข้อมูลสองประเภทที่สามารถรับได้: "สามารถใช้แผงสัมผัสได้หรือไม่" และ "จํานวนจุดสัมผัสสูงสุดที่แผงสัมผัสสามารถรับได้" ไม่มีการเปลี่ยนแปลงระหว่างเกมดังนั้นฉันคิดว่าไม่มีปัญหาหากคุณได้รับตามวิธี Game.Initialize แต่ในอนาคตอุปกรณ์ที่สามารถลบแผงสัมผัส (แผงสัมผัสที่สามารถเชื่อมต่อกับ USB หรืออุปกรณ์จริงอื่นที่ไม่ใช่ Windows Phone) ปรากฏขึ้นและอธิบายไว้ในวิธีอัปเดต

นอกจากนี้ยังไม่จําเป็นต้องตรวจสอบว่าสามารถใช้แผงสัมผัสได้หรือไม่เนื่องจากสามารถใช้กับ Windows Phone 7 ได้ตลอดเวลา แต่เมื่อแชร์รหัสกับ Windows และ Xbox 360 ฮาร์ดแวร์เหล่านี้ไม่จําเป็นต้องใช้อินเทอร์เฟซอินพุตและจําเป็นต้องตรวจสอบ

ถ้าคุณสามารถยืนยันว่า แผงสัมผัสพร้อมใช้งานในคุณสมบัติ "TouchPanelCapabilities.IsConnected" วิธีการ "TouchPanel.GetState" ได้รับสถานะการสัมผัสปัจจุบัน

ในขั้นต้นการประมวลผลการดําเนินการบางอย่างจะดําเนินการหลังจากได้รับข้อมูลการสัมผัส แต่ในตัวอย่างนี้ข้อมูลจะปรากฏขึ้นเท่านั้นดังนั้นจึงไม่มีการประมวลผลเพิ่มเติมในวิธี Game.Update

โปรแกรม -- รับจํานวนสูงสุดของจุดสัมผัสที่คุณจะได้รับ

จํานวนจุดสัมผัสสูงสุดที่สามารถดึงออกมาได้นั้นได้รับการแก้ไขโดยประมาณดังนั้นจึงไม่จําเป็นต้องดึงข้อมูลเหล่านั้นในระหว่างเกม แต่คุณสามารถรับจํานวนจุดสัมผัสสูงสุดที่สามารถดึงได้จากคุณสมบัติ TouchPanelCapabilities.MaximumTouchCount ตัวอย่างเช่น หากคุณสมบัติ MaximumTouchCount เป็น "4" คุณจะไม่สามารถรับข้อมูลตําแหน่งที่ห้าได้โดยการสัมผัสหน้าจอสัมผัสด้วยห้านิ้ว

จํานวนการซื้อกิจการสําหรับสมาร์ทโฟน "HTC 7 Trophy" ที่ใช้ในตัวอย่างนี้คือ "4" (อย่างไรก็ตาม XNA Game Studio 4.0 ถูกกําหนดให้ส่งคืน 4 เสมอ) ข้อมูลจําเพาะของ Windows Phone 7 บอกว่ามีมากกว่า 4 คะแนน ดังนั้นจึงไม่ส่งคืนน้อยกว่า 4)

// タッチ可能な最大数を表示
spriteBatch.DrawString(font,  
                       "MaximumTouchCount : " +
                         capabilities.MaximumTouchCount,
                       new Vector2(20, 50),
                       Color.LightGreen);

図 3 :TouchPanelCapabilities.MaximumTouchCount プロパティの取得数
รูปที่ 3: TouchPanelCapabilities.จํานวนการดึงข้อมูลคุณสมบัติสูงสุดTouchCount

โปรแกรม - รับข้อมูลการสัมผัส

โครงสร้าง TouchCollection ที่ดึงมาประกอบด้วยข้อมูลการสัมผัสหลายรายการ ตัวอย่างเช่นหากคุณสัมผัสด้วยสองนิ้วโดยปกติจะมีการสัมผัสสองครั้ง

จํานวนของข้อมูลการสัมผัสสามารถเรียกค้นได้ในคุณสมบัติ TouchCollection.Count ข้อมูลการสัมผัสจะแสดงซ้ําๆ ในคําสั่ง for กี่ครั้งก็ได้ตามที่ได้รับ เดิมทีไม่มีปัญหาในการวนซ้ํากับ foreach แต่เนื่องจากเราจะใช้ดัชนีอาร์เรย์ (ดัชนี int) ในคําอธิบายในภายหลังเราจึงวนซ้ําด้วย

// タッチ情報の数だけループする
for (int index = 0; index < touches.Count; index++)
{
  // 指定したインデックスのタッチ情報取得
  TouchLocation tl = touches[index];

  // タッチ情報を可視化
  string mes = "Index : " + index + Environment.NewLine +
               "Id : " + tl.Id + Environment.NewLine +
               "Position : " + tl.Position + Environment.NewLine +
               "State : " + tl.State;

  // 文字の描画
  spriteBatch.DrawString(font,
                         mes,
                         new Vector2(30 + (index % 4) * 10,
                                     80 + index * 140),
                         Color.White);
}

ตอนนี้ข้อมูลการสัมผัสแต่ละครั้งจะได้รับเป็นโครงสร้าง "TouchLocation" หากวนซ้ําด้วยสําหรับสามารถรับได้ด้วย "TouchCollection [ดัชนี]" (คุณยังสามารถรับโครงสร้าง "TouchLocation" ได้โดยตรงใน foreach)

ข้อมูลสี่ประเภทต่อไปนี้สามารถรับได้จากโครงสร้าง "TouchLocation" และแต่ละข้อมูลจะแสดงในตัวอย่าง

เมื่อคุณเรียกใช้จริงข้อมูลการสัมผัสจะแสดงขึ้นดังที่แสดงด้านล่าง เมื่อคุณสัมผัสด้วยสามนิ้วคุณสามารถเห็นสามสัมผัส ถ้าคุณแตะด้วยห้านิ้วคุณจะเห็นได้เพียงสี่นิ้วเท่านั้น (เนื่องจากจํานวนการซื้อกิจการสูงสุดคือ 4)

図 4 :3 本の指でタッチしているところ
รูปที่ 4: สัมผัสด้วยสามนิ้ว

โปรแกรม - สิ่งที่ต้องระวังเมื่อดึงข้อมูลการสัมผัส 1 (ดัชนีและ ID)

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

ฉันคิดว่ามันง่ายกว่าที่จะเข้าใจถ้าคุณลองบนเครื่องจริงมากกว่าอธิบายเป็นลายลักษณ์อักษร ตัวอย่างเช่น สมมติว่าคุณใช้สองนิ้ว "นิ้วชี้" และ "นิ้วกลาง" และแตะด้วยนิ้วชี้ก่อน

図 5 :人差し指でタッチ
รูปที่ 5: สัมผัสด้วยนิ้วชี้

ดังที่แสดงบนหน้าจอดัชนีจะเป็น "0" จากนั้นแตะด้วยนิ้วกลางของคุณ

図 6 :中指でタッチ
รูปที่ 6: นิ้วกลางสัมผัส

ในสถานะนี้คุณกําลังสัมผัสด้วยสองนิ้วดังนั้นข้อมูลสองชิ้นจะปรากฏขึ้น ดัชนีที่สัมผัสด้วยนิ้วกลางคือ "1"

ลองยกนิ้วชี้ของเราที่นี่ จากนั้นข้อมูลการสัมผัสจะมีลักษณะดังต่อไปนี้

図 7 :人差し指を放す
รูปที่ 7: ปล่อยนิ้วชี้

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

・ เลื่อนตัวละคร "A" ด้วยนิ้วชี้ของคุณ

・ เลื่อนอักขระ "B" ด้วยนิ้วกลางในสถานะนั้น

・ ปล่อยนิ้วชี้ในขณะที่ขยับตัวละครด้วยนิ้วกลาง

・ ตัวละครที่ควบคุมโดยนิ้วกลางก็เปลี่ยนเป็น" A"

ปรากฏการณ์อีกประการหนึ่งคือหากคุณปล่อยหรือสัมผัสนิ้วใดนิ้วหนึ่งในสองนิ้วซ้ํา ๆ ในขณะที่สัมผัสข้อความรูปวาดของข้อมูลการสัมผัสครั้งแรกอาจกะพริบ นี่เป็นเพราะนิ้วที่สองขัดจังหวะดัชนี "0" ทันทีที่คุณสัมผัสหรือปล่อย

ดังที่ได้กล่าวมาแล้วดัชนีและลําดับของข้อมูลการสัมผัสเมื่อมัลติทัชไม่ตรงกับลําดับที่สัมผัส ถ้าคุณต้องการดําเนินการใด ๆ อย่าจัดการพวกเขาในดัชนี TouchCollection

สิ่งที่ควรจัดการคือโครงสร้าง "TouchLocation" มีคุณสมบัติ "Id" และ Id จะถูกเขียนใหม่ด้วยค่าใหม่ทุกครั้งที่สัมผัส แต่ความสัมพันธ์ระหว่างจุดสัมผัสและ ID จะรับประกันในขณะที่สัมผัสดังนั้นเราจะจัดการ

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

โปรแกรม -- สิ่งที่เก็บไว้ในใจเมื่อได้รับข้อมูลการสัมผัส 2 (จํานวนของข้อมูลการสัมผัสที่ได้รับ)

แม้ว่าจะไม่ได้รวมอยู่ในโปรแกรมของบทความ แต่ตัวอย่างจะดึงสตริง "GetMaxTouchCount" ที่ด้านล่างของหน้าจอและ "จํานวนข้อมูลการสัมผัสสูงสุดที่ได้รับในเวลาเดียวกัน" สิ่งนี้ได้แสดงจํานวนสูงสุดของข้อมูลการสัมผัสที่ได้รับจากวิธี "TouchPanel.GetState" ในอดีต แต่ในเครื่องทดสอบนี้คุณสมบัติ "TouchPanelCapabilities.MaximumTouchCount" คือ 4 ดังนั้นค่าสูงสุดที่แสดงที่นี่ควรเป็น 4 หากคุณใส่ห้านิ้วลงไปมันจะยังคงเป็น 4

図 8 :5 本の指を置いたときの数値
รูปที่ 8: หมายเลขห้านิ้ว

ลองทําการทดลองเล็กน้อย ลองทําซ้ําหน้าจอสัมผัสด้วยหลายนิ้วด้วยความเร็วสูง ขึ้นอยู่กับเครื่องทดสอบ แต่จํานวนอาจเกิน 4 ก่อนที่คุณจะรู้

図 9 :GetMaxTouchCount が 4 を超えている
รูปที่ 9: GetMaxTouchCount มากกว่า 4

ในความเป็นจริงข้อมูลการสัมผัสที่ได้รับจากวิธีการ "TouchPanel.GetState" ไม่ใช่ข้อมูลการสัมผัสในขณะที่เรียกวิธีการ "TouchPanel.GetState" แต่ช่วงเวลาที่คุณสัมผัสและช่วงเวลาที่คุณปล่อยจากเวลาอัปเดตล่าสุดจะถูกแคช ดังนั้นแม้ว่าจะสามารถตรวจจับการสัมผัสได้ถึงสี่ครั้งในเวลาเดียวกันการสัมผัสนิ้วเดียวกันอีกครั้งจะถือว่าเป็นการสัมผัสที่แยกจากกันดังนั้นจึงอาจได้รับข้อมูลการสัมผัสมากกว่า TouchPanelCapabilities.MaximumTouchCount

ดังนั้นแม้ว่า TouchPanelCapabilities.MaximumTouchCount คือ 4 ถ้าจํานวนขององค์ประกอบอาร์เรย์ของข้อมูลที่เกี่ยวข้องกับการสัมผัสได้รับการแก้ไขโดย 4 ข้อผิดพลาด overage ดัชนีอาจเกิดขึ้นขึ้นอยู่กับวิธีการประมวลผล

อย่างไรก็ตามในความช่วยเหลือของ XNA Game Studio ค่าสูงสุดของคุณสมบัติ TouchCollection.Count ถูกอธิบายว่าเป็น "8" ดังนั้นหากคุณต้องการแก้ไขจํานวนองค์ประกอบในอาร์เรย์คุณควรตั้งค่าจํานวนองค์ประกอบเป็นอย่างน้อย 8 (ถ้าคุณคิดเกี่ยวกับการอัพเกรดรุ่นในอนาคตคุณอาจต้องการที่จะรวมประโยคยามเพื่อให้ดัชนีไม่ได้ไปมากกว่า.)

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

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