विंडोज फोन 7, भाग 3 ड्रैग ऑपरेशन के लिए गेम डेवलपमेंट में टच इंटरैक्शन

पेज अद्यतन :
पेज निर्माण की तारीख :

प्रोग्रामिंग! - 3. स्पर्श करने के लिए कार्ड ले जाने का प्रयास करें

इस नमूने के बारे में

इस बार, मैं एक प्रोग्रन बनाना चाहता हूं जो स्क्रीन और स्थानों पर चार कार्ड रखता है और कार्ड को उस स्थान पर खींचता है जहां उन्हें छुआ जाता है। यह प्रोग्राम का एक बहु-स्पर्श संस्करण है जिसने पहले माउस वर्ग के साथ एक स्प्राइट खींचा था। अब तक, कई स्पष्टीकरण दिए गए हैं, इसलिए इस बार मैं मुख्य रूप से कार्यक्रम के बारे में समझाना चाहता हूं।

इस नमूना कार्यक्रम के लक्ष्य

मल्टी-टच के साथ स्पर्श करते समय एक ही समय में कई कार्ड खींचें।

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

कोड को बहुत जटिल न बनाने के लिए, कार्ड वर्ग में तीन गुण हैं: टच आईडी, स्थिति और रंग। विस्तार में जाने के लिए कोई विशेष आइटम नहीं है, लेकिन "टच आईडी" का उपयोग यह जांचने के लिए किया जाता है कि कौन सा टचपॉइंट लिंक किया गया है।

कार्यक्रम - फ़ील्ड घोषित करना

कार्ड की जानकारी रखने के लिए कार्ड कक्षाओं की एक सरणी होने के अलावा इसके बारे में कुछ भी नया नहीं है। इस बार, यह पिछले नमूनों के आवेदन की तरह है। मैंने चार कार्ड बनाए, प्रत्येक एक अलग रंग के साथ ताकि आप ड्राइंग करते समय अंतर देख सकें।

/// <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();

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

प्रोग्राम - स्पर्श करने पर एक टच आईडी को कार्ड से लिंक करें

नमूना कार्यक्रम में, प्रसंस्करण लागत के दृष्टिकोण से आदेश उलट दिया जाता है, लेकिन यह समझना आसान है कि क्या आप इसे यहां से समझाते हैं, इसलिए मैं इसे पहले समझाऊंगा।

सबसे पहले, जानकारी के प्रत्येक टुकड़े को प्राप्त करने के लिए अधिग्रहित टचकलेक्शन फोरच के माध्यम से लूप करें।

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

यह इंगित करने के लिए "टचलोकेशन.स्टेट" गुण की जाँच करें कि "टचलोकेशनस्टेट.प्रेस्ड" वह क्षण है जब आपने इसे छुआ था।

इस नमूने में, यदि कार्ड की आईडी "0" है, तो इसे उपयोग नहीं किए जाने के रूप में परिभाषित किया गया है, इसलिए "कार्ड। कहां (सी = > c.Id == 0)। फर्स्टऑरडिफ़ॉल्ट ()" कार्ड की सूची से आईडी 0 के साथ एक कार्ड की खोज करने और पाए जाने पर उस कार्ड को पुनः प्राप्त करने के लिए। यदि नहीं मिला, तो शून्य वापस आ जाता है। यहां, कोड को सरल बनाने के लिए एक्सटेंशन विधियों को LINQ द्वारा बुलाया जाता है, लेकिन यदि आप प्रसंस्करण लागत के बारे में चिंतित हैं, तो आप लूप के साथ एक-एक करके उन्हें खोज सकते हैं।

जब आपको कार्ड मिलता है, तो कार्ड पर टच आईडी और टच पोजीशन सेट करें।

कार्यक्रम - स्पर्श के दौरान कार्ड हैंडलिंग और जब वे जारी कर रहे हैं

जब आप इसे स्पर्श करते हैं, तो कार्ड को हर समय ड्रैग स्थिति में रखें, और जब आप इसे जारी करते हैं, तो यह टचपॉइंट से कार्ड में डिस्कनेक्ट हो जाएगा।

// 各カードの情報を調べる
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;
    }
  }
}

फोरच के साथ कार्ड सूची लूप करें और प्रत्येक कार्ड को संसाधित करें। यदि आईडी 0 के अलावा कुछ और है, तो यह टचपॉइंट से जुड़ा हुआ है और प्रक्रिया जारी है।

टचकलेक्शन संरचना एक "फाइंडबायआईडी" विधि प्रदान करती है जो आपको निर्दिष्ट आईडी के लिए स्पर्श जानकारी पुनर्प्राप्त करने की अनुमति देती है, यदि कोई मौजूद है। यदि Card.Id संपत्ति 0 नहीं है, तो हम मान सकते हैं कि यह कुछ स्पर्श बिंदु से जुड़ा हुआ है, इसलिए हम फाइंडबीआईडी विधि के साथ स्पर्श जानकारी प्राप्त करने का प्रयास करेंगे।

यदि फाइंडबायआईडी विधि सही लौटाती है, तो यह अभी भी स्पर्श स्थिति में है, इसलिए टचलोकेशन.पोजिशन प्रॉपर्टी से स्पर्श स्थिति प्राप्त करें और इसे कार्ड क्लास में सेट करें। यदि फाइंडबायआईडी विधि झूठी लौटाती है, तो स्पर्श जारी किया जाता है, इसलिए Card.ID 0 पर सेट करें और इसे सेट करें क्योंकि कोई भी इसे छू नहीं रहा है।

कार्यक्रम - ड्राइंग कार्ड

ड्राइंग के लिए आवश्यक मापदंडों को पहले से ही कार्ड वर्ग पर सेट किया जाना चाहिए, इसलिए कुछ भी नया नहीं है।

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

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

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

इस नमूने का सारांश

इस बार, मैंने एक छवि प्रोग्राम बनाने की कोशिश की जो वास्तव में गेम में वस्तुओं को स्थानांतरित करने के लिए मल्टी-टच का उपयोग करता है। हमने यह भी देखा कि जब स्पर्श जानकारी की आईडी का उपयोग करके एक ही समय में कई कार्ड खींचे गए थे, तो कार्ड की गति सुसंगत थी, भले ही दूसरी उंगली को फिर से उठाया या छुआ गया हो।

यह नमूना सिर्फ एक नमूना है और केवल सरल प्रसंस्करण किया जाता है। हालांकि, टच पैनल द्वारा मल्टी-टच ऑपरेशन का मूल हिस्सा वास्तविक गेम प्रोग्रामिंग द्वारा कवर किया जाना चाहिए, इसलिए कृपया इसे मल्टी-टच प्रोसेसिंग पर लागू करें जो इस आधार पर आपके गेम के अनुरूप है।