Interacțiuni tactile în dezvoltarea jocurilor pentru Windows Phone 7, Partea 3 Glisați operațiunile

Pagina actualizată :
Data creării paginii :

Programare! - 3.Încercați să mutați cardul la atingere

Despre acest eșantion

De data aceasta, aș dori să creez un progran care plasează patru cărți pe ecran și locuri și trage cărțile în locul în care sunt atinse. Aceasta este o versiune multi-touch a programului care a tras mai întâi un sprite cu clasa mouse-ului. Până acum, au existat multe explicații, așa că de data aceasta aș dori să explic în principal despre program.

Obiectivele acestui program de probă

Glisați mai multe cărți în același timp în care atingeți cu mai multe atingeri.

図 1 :マルチタッチによるドラッグ操作
Figura 1: Operațiune de tragere multi-touch

Program - Cursuri de carduri

Când vine vorba de multi-touch, devine necesar să aveți mai multe obiecte, așa că aici aș dori să creez o clasă "Card" cu sprite pentru a fi mutată ca o "carte".

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

Pentru a nu face codul prea complicat, clasa de carduri are trei proprietăți: id-ul tactil, poziția și culoarea. Nu există un anumit element pentru a intra în detalii, dar "Touch ID" este utilizat pentru a verifica ce punct de contact este legat.

Program - Declararea domeniilor

Nu e nimic nou despre asta, altele decât având o serie de clase de card să dețină informații card. De data aceasta, este ca o aplicare a probelor anterioare. Am făcut patru cărți, fiecare cu o culoare diferită, astfel încât să puteți vedea diferența atunci când desenați.

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

Programatic - Obțineți informații tactile

În interiorul metodei Game.Update. Acest domeniu este formulatic, deci nu este nimic deosebit de nou.

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

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

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

Program - Legarea unui ID tactil la un card atunci când este atins

În programul eșantion, ordinea este inversată din punctul de vedere al costului de procesare, dar este mai ușor de înțeles dacă o explicați de aici, așa că voi explica mai întâi acest lucru.

În primul rând, bucla prin touchcollection dobândite foreach pentru a obține fiecare bucată de informații.

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

Verificați proprietatea "TouchLocation.State" pentru a indica faptul că "TouchLocationState.Pressed" este momentul în care l-ați atins.

În acest eșantion, dacă id-ul cardului este "0", acesta este definit ca nefiind utilizat, deci "carduri". Unde(c => c.Id == 0). FirstOrDefault()" pentru a căuta o carte cu ID-ul 0 din lista de carduri și pentru a prelua acel card dacă este găsit. Dacă nu a fost găsit, se returnează null. Aici, metodele de extensie sunt apelate de LINQ pentru a simplifica codul, dar dacă sunteți preocupat de costurile de procesare, le puteți căuta unul câte unul cu o buclă.

Când găsiți cardul, setați ID-ul tactil și poziția tactilă pe card.

Program - manipularea cardurilor în timpul atingerii și atunci când sunt eliberate

Păstrați cardul într-o stare de tragere în orice moment în timp ce îl atingeți, iar când îl eliberați, acesta va fi deconectat de la punctul de contact al cardului.

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

Buclați lista de cărți cu foreach și procesați fiecare carte. Dacă ID-ul este altceva decât 0, acesta este legat de punctul de contact și procesul continuă.

Structura TouchCollection oferă o metodă "FindById" care vă permite să regăsiți informațiile tactile pentru ID-ul specificat, dacă există unul. Dacă proprietatea Card.Id nu este 0, putem presupune că este asociată cu un punct de contact, așa că vom încerca să obținem informațiile tactile cu metoda FindById.

Dacă metoda FindById returnează true, este încă în starea de atingere, deci obțineți poziția tactilă din proprietatea TouchLocation.Position și setați-o în clasa de carduri. Dacă metoda FindById returnează false, atingerea este eliberată, deci setați Card.ID la 0 și setați-o ca nimeni nu o atinge.

Program - Desenarea cardurilor

Parametrii necesari pentru desen ar trebui să fie deja setați la clasa Card, deci nu este nimic nou.

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

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

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

Rezumatul acestui eșantion

De data aceasta, am încercat să creeze un program de imagine care utilizează multi-touch pentru a muta de fapt, obiecte în joc. De asemenea, am observat că atunci când mai multe carduri au fost trase în același timp folosind ID-ul informațiilor tactile, mișcarea cardurilor a fost consecventă, chiar dacă celălalt deget a fost ridicat sau atins din nou.

Această probă este doar o probă și se efectuează numai o prelucrare simplă. Cu toate acestea, partea de bază a operațiunii multi-touch de către panoul tactil ar trebui să fie acoperită de programarea efectivă a jocului, așa că vă rugăm să o aplicați procesării multi-touch care se potrivește jocului dvs., pe baza acestui lucru.