تعاملات لمسی در توسعه بازی برای ویندوز فون 7 ، قسمت 3 عملیات کشیدن

صفحه به روز شده :
تاریخ ایجاد صفحه :

برنامه نویسی! - 3.سعی کنید انتقال کارت به لمس

درباره این نمونه

این بار می خواهم پروگران ایجاد کنم که چهار کارت را روی صفحه نمایش و مکان ها قرار دهد و کارت ها را به جایی که لمس می شوند بکشد. این نسخه چند لمسی از برنامه است که برای اولین بار کشیده sprite با کلاس ماوس است. تا به حال توضیحات زیادی وجود داشته است، بنابراین این بار می خواهم عمدتا ً در مورد برنامه توضیح دهم.

اهداف این برنامه نمونه

کشیدن کارت های متعدد در همان زمان که شما با لمس چند لمسی.

図 1 :マルチタッチによるドラッグ操作
شکل 1: عملیات کشیدن چند لمسی

برنامه - کلاس های کارت

هنگامی که آن را به چند لمسی می آید، لازم می شود به اشیاء متعدد، بنابراین در اینجا من می خواهم برای ایجاد یک کلاس "کارت" با sprite به عنوان یک "کارت" منتقل می شود.

/// <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, },
};

برنامه ای -- دریافت اطلاعات لمسی

داخل روش Game.Update. این منطقه فرمولیک است، بنابراین هیچ چیز به خصوص جدید وجود دارد.

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

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

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

برنامه - لینک یک شناسه لمسی به یک کارت زمانی که لمس

در برنامه نمونه، ترتیب از دیدگاه هزینه پردازش معکوس می شود، اما درک آن آسان تر است اگر شما آن را از اینجا توضیح دهید، بنابراین من این را اول توضیح می دهم.

اول ، حلقه را از طریق foreach 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" لحظه ای است که شما آن را لمس کرده است.

در این نمونه اگر شناسه کارت «۰» باشد، به صورت استفاده نشدن تعریف می شود، بنابراین «کارت» است. where(c => c.Id == 0). FirstOrDefault()" برای جستجوی کارت با ID 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;
    }
  }
}

لیست کارت را با استیضاح حلقه کنید و هر کارت را پردازش کنید. اگر شناسه چیزی غیر از ۰ باشد، به نقطه لمسی مرتبط می شود و فرایند ادامه می یابد.

ساختار TouchCollection یک روش "FindById" را فراهم می کند که به شما اجازه می دهد تا اطلاعات لمسی را برای شناسه مشخص شده بازیابی کنید، در صورتی که یکی وجود داشته باشد. اگر Card.Id 0 نیست، ما می توانیم فرض کنیم که آن را با برخی از نقطه لمسی همراه است، بنابراین ما سعی خواهیم کرد برای دریافت اطلاعات لمسی با روش FindById.

اگر روش FindById درست برگردد، هنوز در حالت لمسی است، بنابراین موقعیت لمسی را از ملک TouchLocation.Position دریافت کنید و آن را در کلاس کارت تنظیم کنید. اگر روش FindById غلط برمی گردد، لمس آزاد می شود، بنابراین Card.ID روی 0 تنظیم کنید و آن را طوری تنظیم کنید که هیچ آن را لمس نمی کند.

برنامه - کارت های نقاشی

پارامترهای مورد نیاز برای نقاشی باید در حال حاضر به کلاس کارت تنظیم شده است، بنابراین هیچ چیز جدیدی وجود دارد.

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

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

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

خلاصه این نمونه

این بار سعی کردم یک برنامه تصویری بسازم که از چند لمسی استفاده کند تا در واقع اشیاء را در بازی جابه جا کند. ما همچنین مشاهده کردیم که هنگامی که کارت های متعدد در همان زمان با استفاده از شناسه اطلاعات لمسی کشیده می شدند، حرکت کارت ها حتی اگر انگشت دیگر برداشته شود یا دوباره لمس شود، سازگار بود.

این نمونه فقط یک نمونه است و فقط پردازش ساده انجام می شود. با این حال ، بخش اساسی از عملیات چند لمسی توسط پانل لمسی باید توسط برنامه نویسی بازی واقعی تحت پوشش ، بنابراین لطفا آن را به پردازش چند لمسی است که مناسب بازی خود را بر اساس این اعمال می شود.