تفاعلات اللمس في تطوير الألعاب ل 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, },
};

برمجي - الحصول على معلومات اللمس

داخل طريقة Game.Update. هذا المجال صيغي ، لذلك لا يوجد شيء جديد بشكل خاص.

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

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

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

البرنامج - ربط معرف اللمس ببطاقة عند لمسها

في برنامج العينة ، يتم عكس الترتيب من وجهة نظر تكلفة المعالجة ، ولكن من الأسهل فهمه إذا قمت بشرحه من هنا ، لذلك سأشرح ذلك أولا.

أولا ، قم بحلقة من خلال 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" هي اللحظة التي لمستها.

في هذه العينة ، إذا كان معرف البطاقة هو "0" ، تعريفه على أنه غير مستخدم ، لذلك "البطاقات. حيث(c => c.Id == 0). FirstOrDefault()" للبحث عن بطاقة ذات معرف 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;
    }
  }
}

قم بتكرار قائمة البطاقات مع foreach وقم بمعالجة كل بطاقة. إذا كان المعرف أي شيء آخر غير 0 ، ربطه بنقطة الاتصال وتستمر العملية.

توفر بنية TouchCollection طريقة "FindById" التي تسمح لك باسترداد معلومات اللمس للمعرف المحدد ، إن وجد. إذا لم تكن الخاصية Card.Id 0 ، فيمكننا افتراض أنها مرتبطة ببعض نقاط الاتصال ، لذلك سنحاول الحصول على معلومات اللمس باستخدام طريقة FindById.

إذا كانت طريقة FindById ترجع true، فإنها لا تزال في حالة اللمس، لذا احصل على موضع اللمس من الخاصية TouchLocation.Position وقم بتعيينها في فئة البطاقة. إذا كانت طريقة FindById ترجع false، تحرير اللمسة، لذا قم بتعيين Card.ID إلى 0 وقم بتعيينها حيث لا يلمسها أحد.

البرنامج - بطاقات الرسم

يجب بالفعل تعيين المعلمات اللازمة للرسم على فئة البطاقة ، لذلك لا يوجد شيء جديد.

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

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

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

ملخص هذه العينة

هذه المرة ، حاولت إنشاء برنامج صور يستخدم اللمس المتعدد لنقل الكائنات فعليا في اللعبة. لاحظنا أيضا أنه عندما يتم سحب بطاقات متعددة في نفس الوقت باستخدام معرف معلومات اللمس ، كانت حركة البطاقات متسقة حتى لو تم رفع الإصبع الآخر أو لمسه مرة أخرى.

هذه العينة هي مجرد عينة ويتم تنفيذ معالجة بسيطة فقط. ومع ذلك ، يجب تغطية الجزء الأساسي من عملية اللمس المتعدد بواسطة لوحة اللمس من خلال برمجة اللعبة الفعلية ، لذا يرجى تطبيقه على معالجة اللمس المتعدد التي تناسب لعبتك بناء على ذلك.