Jutiklinės sąveikos kuriant žaidimus, skirtus "Windows Phone 7", 3 dalis Vilkimo operacijos

Puslapis atnaujintas :
Puslapio sukūrimo data :

Programavimo! - 3.Pabandykite perkelti kortelę į prisilietimą

Apie šį pavyzdį

Šį kartą norėčiau sukurti prograną, kuri įdeda keturias kortas į ekraną ir padeda bei tempia kortas į vietą, kur jos paliečiamos. Tai kelių prisilietimų programos versija, kuri pirmą kartą nutempė sprite su pelės klase. Iki šiol buvo daug paaiškinimų, todėl šį kartą norėčiau paaiškinti daugiausia apie programą.

Šios pavyzdinės programos tikslai

Vilkite kelias korteles vienu metu, kai liečiate keliais lietimais.

図 1 :マルチタッチによるドラッグ操作
1 paveikslas: "Multi-touch" vilkimo operacija

Programa - kortelių klasės

Kalbant apie daugialypį prisilietimą, reikia turėti kelis objektus, todėl čia norėčiau sukurti "Kortelės" klasę su sprite, kuri būtų perkelta kaip "kortelė".

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

Kad kodas nebūtų pernelyg sudėtingas, kortelės klasė turi tris savybes: jutiklinį ID, padėtį ir spalvą. Nėra konkretaus elemento, į kurį būtų galima įsigilinti, tačiau "Touch ID" naudojamas norint patikrinti, kuris jutiklinis taškas yra susietas.

Programa - laukų deklaravimas

Jame nėra nieko naujo, išskyrus tai, kad jame yra daugybė kortelių klasių, skirtų kortelių informacijai laikyti. Šį kartą tai tarsi ankstesnių pavyzdžių taikymas. Aš padariau keturias korteles, kurių kiekviena turi skirtingą spalvą, kad piešdami galėtumėte pamatyti skirtumą.

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

Programinis – gaukite lietimo informaciją

Game.Update metodo viduje. Ši sritis yra formulinė, todėl nėra nieko ypač naujo.

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

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

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

Programa – palieskite ID su kortele, kai ji paliesta

Pavyzdžių programoje užsakymas yra pakeistas apdorojimo išlaidų požiūriu, tačiau lengviau suprasti, jei paaiškinsite jį iš čia, todėl pirmiausia paaiškinsiu tai.

Pirmiausia peržiūrėkite įsigytą "TouchCollection", kad gautumėte kiekvieną informaciją.

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

Patikrinkite ypatybę "TouchLocation.State", kad nurodytumėte, jog "TouchLocationState.Pressed" yra momentas, kai jį palietėte.

Šiame pavyzdyje, jei kortelės ID yra "0", jis apibrėžiamas kaip nenaudojamas, taigi "kortelės. Kur(c => c.Id == 0). FirstOrDefault()" ieškoti kortelės su ID 0 iš kortelių sąrašo ir atsiimti tą kortelę, jei ji rasta. Jei nerasta, grąžinamas neapibrėžtas. Čia LINQ vadina plėtinio metodus, kad supaprastintų kodą, tačiau jei nerimaujate dėl apdorojimo išlaidų, galite jų ieškoti po vieną su kilpa.

Radę kortelę, nustatykite jutiklinį ID ir palieskite padėtį kortelėje.

Programa - kortelių tvarkymas prisilietimo metu ir kai jos atleidžiamos

Visada laikykite kortelę vilkimo būsenoje, kol ją paliesite, o kai ją atleisite, ji bus atjungta nuo kontaktinio taško prie kortelės.

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

Užveskite kortelių sąrašą su foreach ir apdorokite kiekvieną kortelę. Jei ID yra ne 0, jis susiejamas su sąlyčio tašku ir procesas tęsiamas.

"TouchCollection" struktūra suteikia "FindById" metodą, leidžiantį gauti nurodyto ID jutiklinę informaciją, jei tokia yra. Jei Card.Id ypatybė nėra 0, galime manyti, kad ji yra susijusi su kokiu nors sąlyčio tašku, todėl bandysime gauti jutiklinę informaciją naudodami "FindById" metodą.

Jei "FindById" metodas grąžina tiesą, jis vis dar yra lietimo būsenoje, todėl gaukite jutiklinę padėtį iš ypatybės TouchLocation.Position ir nustatykite ją kortelių klasėje. Jei "FindById" metodas pateikia klaidingą, prisilietimas atleidžiamas, todėl nustatykite Card.ID į 0 ir nustatykite, kad niekas jo neliestų.

Programa - piešimo kortelės

Piešimui reikalingi parametrai jau turėtų būti nustatyti į kortelių klasę, todėl nėra nieko naujo.

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

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

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

Šios imties santrauka

Šį kartą bandžiau sukurti vaizdo programą, kuri naudoja kelių palietimų funkciją, kad iš tikrųjų perkeltų žaidimo objektus. Taip pat pastebėjome, kad kai vienu metu buvo tempiamos kelios kortelės, naudojant jutiklinės informacijos ID, kortelių judėjimas buvo nuoseklus, net jei kitas pirštas buvo pakeltas ar vėl paliestas.

Šis mėginys yra tik pavyzdys ir atliekamas tik paprastas apdorojimas. Tačiau pagrindinė jutiklinio skydelio kelių palietimų operacijos dalis turėtų būti padengta faktiniu žaidimo programavimu, todėl pritaikykite ją kelių palietimų apdorojimui, kuris tinka jūsų žaidimui pagal tai.