אינטראקציות מגע בפיתוח משחקים עבור Windows Phone 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; }
}

כדי לא להפוך את הקוד למסובך מדי, למחלקת הכרטיסים יש שלושה מאפיינים: touch ID, מיקום וצבע. אין פריט מסוים להיכנס לפרטים, אבל "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();

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

תוכנית - קישור Touch 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" הוא הרגע שבו נגעת בו.

בדוגמה זו, אם מזהה הכרטיס הוא "0", הוא מוגדר כלא בשימוש, ולכן "כרטיסים. כאשר(c => c.Id == 0). FirstOrDefault()" כדי לחפש כרטיס עם מזהה 0 מרשימת הכרטיסים ולאחזר כרטיס זה אם נמצא. אם לא נמצא, מוחזר Null. כאן, שיטות הרחבה נקראות על ידי LINQ כדי לפשט את הקוד, אבל אם אתה מודאג לגבי עלויות עיבוד, אתה יכול לחפש אותם אחד אחד עם לולאה.

כאשר תמצא את הכרטיס, הגדר את ה-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 ועבד כל כרטיס. אם המזהה הוא משהו אחר מאשר 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();

סיכום מדגם זה

הפעם, ניסיתי ליצור תוכנית תמונה המשתמשת במולטי-טאץ' כדי להזיז אובייקטים במשחק. ראינו גם שכאשר מספר כרטיסים נגררו בו-זמנית באמצעות המזהה של פרטי המגע, תנועת הכרטיסים הייתה עקבית גם אם האצבע השנייה הורמה או נגעה שוב.

מדגם זה הוא רק מדגם ורק עיבוד פשוט מבוצע. עם זאת, החלק הבסיסי של פעולת המולטי-טאץ' על ידי לוח המגע צריך להיות מכוסה על ידי תכנות משחק בפועל, אז אנא החל אותו על עיבוד מולטי-טאץ' שמתאים למשחק שלך בהתבסס על זה.