Interaksi sentuh dalam pengembangan game untuk Windows Phone 7, Bagian 3 Operasi seret

Halaman Diperbarui :
Tanggal pembuatan halaman :

Pemrograman! - 3.Coba pindahkan kartu ke sentuhan

Tentang sampel ini

Kali ini, saya ingin membuat progran yang menempatkan empat kartu di layar dan tempat dan menyeret kartu ke tempat di mana mereka disentuh. Ini adalah versi multi-sentuh dari program yang pertama kali menyeret sprite dengan kelas Mouse. Sampai saat ini, ada banyak penjelasan, jadi kali ini saya ingin menjelaskan terutama tentang program tersebut.

Tujuan dari program sampel ini

Seret beberapa kartu secara bersamaan saat Anda menyentuh dengan multisentuh.

図 1 :マルチタッチによるドラッグ操作
Gambar 1: Operasi seret multisentuh

Program - Kelas Kartu

Ketika datang ke multi-touch, menjadi perlu untuk memiliki banyak objek, jadi di sini saya ingin membuat kelas "Kartu" dengan sprite untuk dipindahkan sebagai "kartu".

/// <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 kode terlalu rumit, kelas kartu memiliki tiga properti: ID sentuh, posisi, dan warna. Tidak ada item tertentu untuk masuk ke detail, tetapi "Touch ID" digunakan untuk memeriksa touchpoint mana yang ditautkan.

Program - Mendeklarasikan Bidang

Tidak ada yang baru tentang itu selain memiliki berbagai kelas Kartu untuk menyimpan informasi kartu. Kali ini, ini seperti aplikasi dari sampel sebelumnya. Saya membuat empat kartu, masing-masing dengan warna yang berbeda sehingga Anda dapat melihat perbedaannya saat menggambar.

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

Terprogram - Dapatkan Informasi Sentuh

Di dalam metode Game.Update. Area ini diformulasikan, jadi tidak ada yang baru.

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

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

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

Program - Tautkan ID sentuh ke kartu saat disentuh

Dalam program sampel, urutannya terbalik dari sudut pandang biaya pemrosesan, tetapi lebih mudah dipahami jika Anda menjelaskannya dari sini, jadi saya akan menjelaskan ini terlebih dahulu.

Pertama, loop melalui TouchCollection yang diperoleh foreach untuk mendapatkan setiap informasi.

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

Periksa properti "TouchLocation.State" untuk menunjukkan bahwa "TouchLocationState.Pressed" adalah saat Anda menyentuhnya.

Dalam sampel ini, jika ID kartu adalah "0", itu didefinisikan sebagai tidak digunakan, jadi "kartu. Dimana(c => c.Id == 0). FirstOrDefault()" untuk mencari kartu dengan ID 0 dari daftar kartu dan mengambil kartu itu jika ditemukan. Jika tidak ditemukan, null dikembalikan. Di sini, metode ekstensi dipanggil oleh LINQ untuk menyederhanakan kode, tetapi jika Anda khawatir tentang biaya pemrosesan, Anda dapat mencarinya satu per satu dengan for loop.

Saat Anda menemukan kartu, atur ID sentuh dan posisi sentuh pada kartu.

Program - menangani kartu saat disentuh dan saat dirilis

Simpan kartu dalam keadaan seret setiap saat saat Anda menyentuhnya, dan saat Anda melepaskannya, kartu akan terputus dari titik kontak ke kartu.

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

Ulangi daftar kartu dengan foreach dan proses setiap kartu. Jika ID adalah apa pun selain 0, itu terkait dengan touchpoint dan proses berlanjut.

Struktur TouchCollection menyediakan metode "FindById" yang memungkinkan Anda untuk mengambil informasi sentuh untuk ID yang ditentukan, jika ada. Jika properti Card.Id bukan 0, kita dapat mengasumsikan bahwa itu terkait dengan beberapa titik sentuh, jadi kita akan mencoba untuk mendapatkan informasi sentuhan dengan metode FindById.

Jika metode FindById mengembalikan true, metode ini masih dalam status sentuh, jadi dapatkan posisi sentuh dari properti TouchLocation.Position dan atur di kelas kartu. Jika metode FindById mengembalikan false, sentuhan dilepaskan, jadi atur Card.ID ke 0 dan atur karena tidak ada yang menyentuhnya.

Program - Menggambar Kartu

Parameter yang diperlukan untuk menggambar harus sudah diatur ke kelas Card, 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 mencoba membuat program gambar yang menggunakan multi-touch untuk benar-benar memindahkan objek dalam game. Kami juga mengamati bahwa ketika beberapa kartu diseret pada saat yang sama menggunakan ID informasi sentuhan, pergerakan kartu konsisten bahkan jika jari lainnya diangkat atau disentuh lagi.

Sampel ini hanyalah sampel dan hanya pemrosesan sederhana yang dilakukan. Namun, bagian dasar dari operasi multi-sentuh oleh panel sentuh harus dicakup oleh pemrograman game yang sebenarnya, jadi harap terapkan ke pemrosesan multi-sentuh yang sesuai dengan game Anda berdasarkan ini.