Interaksi sentuhan dalam pembangunan permainan untuk Windows Phone 7, Bahagian 3 Seret operasi

Laman dikemaskini :
Tarikh penciptaan halaman :

Pengaturcaraan! - 3.Cuba gerakkan kad ke sentuhan

Mengenai sampel ini

Kali ini, saya ingin membuat progran yang meletakkan empat kad pada skrin dan tempat dan menyeret kad ke tempat di mana mereka disentuh. Ini adalah versi multi-sentuhan program yang mula-mula menyeret sprite dengan kelas Tetikus. Sehingga kini, terdapat banyak penjelasan, jadi kali ini saya ingin menjelaskan terutamanya mengenai program ini.

Matlamat program sampel ini

Seret berbilang kad pada masa yang sama apabila anda menyentuh dengan berbilang sentuhan.

図 1 :マルチタッチによるドラッグ操作
Rajah 1: Operasi seret berbilang sentuhan

Program - Kelas Kad

Apabila bercakap tentang pelbagai sentuhan, ia menjadi perlu untuk mempunyai berbilang objek, jadi di sini saya ingin membuat kelas "Kad" dengan sprite untuk dipindahkan sebagai "kad".

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

Agar tidak membuat kod terlalu rumit, kelas kad mempunyai tiga sifat: ID sentuh, kedudukan, dan warna. Tiada item tertentu untuk terperinci, tetapi "Touch ID" digunakan untuk menyemak titik sentuh yang dipautkan.

Program - Mengisytiharkan Bidang

Tiada apa-apa yang baru mengenainya selain daripada mempunyai pelbagai kelas Kad untuk menyimpan maklumat kad. Kali ini, ia seperti aplikasi sampel sebelumnya. Saya membuat empat kad, masing-masing dengan warna yang berbeza supaya anda dapat melihat perbezaan semasa melukis.

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

Programatik - Dapatkan Maklumat Sentuhan

Di dalam kaedah Game.Update. Kawasan ini adalah formulaik, jadi tidak ada yang baru.

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

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

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

Program - Pautkan ID sentuh ke kad apabila disentuh

Dalam program sampel, pesanan dibalikkan dari sudut pandangan kos pemprosesan, tetapi lebih mudah difahami jika anda menerangkannya dari sini, jadi saya akan menerangkannya terlebih dahulu.

Pertama, gelung melalui TouchCollection yang diperolehi untuk mendapatkan setiap maklumat.

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

Semak hartanah "TouchLocation.State" untuk menunjukkan bahawa "TouchLocationState.Pressed" adalah saat anda menyentuhnya.

Dalam sampel ini, jika ID kad adalah "0", ia ditakrifkan sebagai tidak digunakan, jadi "kad. Di mana(c => c.Id == 0). FirstOrDefault()" untuk mencari kad dengan ID 0 dari senarai kad dan mendapatkan semula kad tersebut jika dijumpai. Jika tidak dijumpai, nol dikembalikan. Di sini, kaedah lanjutan dipanggil oleh LINQ untuk memudahkan kod, tetapi jika anda bimbang tentang kos pemprosesan, anda boleh mencarinya satu persatu dengan gelung.

Apabila anda menemui kad, tetapkan ID sentuh dan sentuh kedudukan pada kad.

Program - mengendalikan kad semasa sentuhan dan apabila ia dikeluarkan

Simpan kad dalam keadaan seret pada setiap masa semasa anda menyentuhnya, dan apabila anda melepaskannya, ia akan diputuskan sambungan dari titik sentuh ke kad.

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

Gelung senarai kad dengan masing-masing dan proses setiap kad. Jika ID adalah apa-apa selain daripada 0, ia dipautkan ke titik sentuhan dan proses berterusan.

Struktur TouchCollection menyediakan kaedah "FindById" yang membolehkan anda mendapatkan semula maklumat sentuhan untuk ID yang ditentukan, jika ada. Jika harta Card.Id tidak 0, kita boleh menganggap bahawa ia dikaitkan dengan beberapa titik sentuhan, jadi kami akan cuba mendapatkan maklumat sentuhan dengan kaedah FindById.

Jika kaedah FindById kembali benar, ia masih dalam keadaan sentuhan, jadi dapatkan kedudukan sentuh dari sifat TouchLocation.Position dan tetapkannya dalam kelas kad. Jika kaedah FindById mengembalikan palsu, sentuhan dikeluarkan, jadi tetapkan Card.ID hingga 0 dan tetapkannya kerana tiada siapa yang menyentuhnya.

Program - Kad Lukisan

Parameter yang diperlukan untuk lukisan sudah ditetapkan ke kelas Kad, jadi tidak ada yang baru.

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

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

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

Ringkasan sampel ini

Kali ini, saya cuba mencipta program imej yang menggunakan berbilang sentuhan untuk benar-benar menggerakkan objek dalam permainan. Kami juga mendapati bahawa apabila beberapa kad diseret pada masa yang sama menggunakan ID maklumat sentuhan, pergerakan kad adalah konsisten walaupun jari lain diangkat atau disentuh lagi.

Sampel ini hanyalah sampel dan hanya pemprosesan mudah dilakukan. Walau bagaimanapun, bahagian asas operasi berbilang sentuhan oleh panel sentuh harus dilindungi oleh pengaturcaraan permainan sebenar, jadi sila gunakannya untuk pemprosesan berbilang sentuhan yang sesuai dengan permainan anda berdasarkan ini.