ونڈوز فون 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 کے ساتھ کارڈ تلاش کرنے اور ملنے پر اس کارڈ کو بازیافت کرنے کے لئے۔ اگر نہیں ملا تو ، صفر واپس آجاتا ہے۔ یہاں ، توسیع کے طریقوں کو کوڈ کو آسان بنانے کے لئے لنک کے ذریعہ بلایا جاتا ہے ، لیکن اگر آپ پروسیسنگ کے اخراجات کے بارے میں فکر مند ہیں تو ، آپ لوپ کے لئے ایک ایک کرکے ان کی تلاش کرسکتے ہیں۔

جب آپ کو کارڈ مل جائے تو ، کارڈ پر ٹچ آئی ڈی اور ٹچ پوزیشن مرتب کریں۔

پروگرام - رابطے کے دوران اور جب وہ جاری کیے جاتے ہیں تو کارڈز کو ہینڈل کرنا

کارڈ کو چھوتے وقت ہر وقت ڈریگ حالت میں رکھیں ، اور جب آپ اسے جاری کریں گے تو ، یہ ٹچ پوائنٹ سے کارڈ سے منقطع ہوجائے گا۔

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

اس نمونے کا خلاصہ

اس بار ، میں نے ایک تصویری پروگرام بنانے کی کوشش کی جو کھیل میں اشیاء کو اصل میں منتقل کرنے کے لئے ملٹی ٹچ کا استعمال کرتا ہے۔ ہم نے یہ بھی مشاہدہ کیا کہ جب ٹچ کی معلومات کی شناخت کا استعمال کرتے ہوئے ایک ہی وقت میں ایک سے زیادہ کارڈز کو گھسیٹا گیا تھا تو ، کارڈوں کی نقل و حرکت مستقل تھی یہاں تک کہ اگر دوسری انگلی کو دوبارہ اٹھایا یا چھوا گیا ہو۔

یہ نمونہ صرف ایک نمونہ ہے اور صرف سادہ پروسیسنگ انجام دی جاتی ہے. تاہم ، ٹچ پینل کے ذریعہ ملٹی ٹچ آپریشن کا بنیادی حصہ اصل گیم پروگرامنگ کے ذریعہ احاطہ کیا جانا چاہئے ، لہذا براہ کرم اسے ملٹی ٹچ پروسیسنگ پر لاگو کریں جو اس کی بنیاد پر آپ کے کھیل کے مطابق ہو۔