Interaccions tàctils en el desenvolupament de jocs per al Windows Phone 7, Part 3 Operacions d'arrossegament

Pàgina actualitzada :
Data de creació de la pàgina :

Programació! - 3.Intenta moure la targeta al tacte

Sobre aquesta mostra

Aquesta vegada, m'agradaria crear un progran que col·loqui quatre cartes a la pantalla i col·loqui i arrossegui les cartes fins al lloc on es toquen. Aquesta és una versió multitàctil del programa que primer va arrossegar un sprite amb la classe Mouse. Fins ara, hi ha hagut moltes explicacions, així que aquesta vegada m'agradaria explicar principalment sobre el programa.

Objectius d'aquest programa de mostra

Arrossega diverses targetes al mateix temps que toquis amb múltiples tocs.

図 1 :マルチタッチによるドラッグ操作
Figura 1: Operació d'arrossegament multitàctil

Programa - Classes de targetes

Quan es tracta de multitàctil, es fa necessari tenir diversos objectes, així que aquí m'agradaria crear una classe de "Targeta" amb l'sprite per moure's com a "targeta".

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

Per no complicar massa el codi, la classe de targetes té tres propietats: identificador tàctil, posició i color. No hi ha cap element concret per entrar en detalls, però "Touch ID" s'utilitza per comprovar quin punt de contacte està enllaçat.

Programa - Declaració de Camps

No hi ha res de nou al respecte, a part de tenir una sèrie de classes de targetes per contenir la informació de la targeta. Aquesta vegada, és com una aplicació de les mostres anteriors. Vaig fer quatre cartes, cadascuna amb un color diferent perquè pugueu veure la diferència a l'hora de dibuixar.

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

Programàtic - Obtenir informació tàctil

Dins del mètode Game.Update. Aquesta àrea és fòrmica, de manera que no hi ha res especialment nou.

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

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

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

Programa: enllaçar un identificador tàctil a una targeta quan es toca

Al programa de mostra, l'ordre s'inverteix des del punt de vista del cost de processament, però és més fàcil d'entendre si ho expliqueu des d'aquí, així que ho explicaré primer.

En primer lloc, feu un bucle a través de la capa anterior de TouchCollection adquirida per obtenir cada informació.

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

Comproveu la propietat "TouchLocation.State" per indicar que "TouchLocationState.Pressed" és el moment en què l'heu tocat.

En aquesta mostra, si l'identificador de la targeta és "0", es defineix com a no utilitzat, de manera que "targetes". On(c => c.Id == 0). FirstOrDefault()" per buscar una targeta amb DNI 0 de la llista de targetes i recuperar aquesta targeta si es troba. Si no es troba, es retorna nul. Aquí, LINQ anomena mètodes d'extensió per simplificar el codi, però si us preocupen els costos de processament, podeu cercar-los un per un amb un bucle.

Quan trobis la targeta, defineix el touch ID i toca la posició de la targeta.

Programa: manipulació de targetes durant el tacte i quan s'alliberen

Mantingueu la targeta en estat d'arrossegament en tot moment mentre la toqueu i, quan la deixeu anar, es desconnectarà del punt de contacte a la targeta.

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

Feu un bucle de la llista de targetes amb la previsió i processeu cada targeta. Si l'identificador és una altra cosa que no sigui 0, s'enllaça al punt de contacte i el procés continua.

L'estructura TouchCollection proporciona un mètode "FindById" que permet recuperar la informació tàctil de l'identificador especificat, si n'hi ha. Si la propietat Card.Id no és 0, podem suposar que està associada a algun punt de contacte, de manera que intentarem obtenir la informació tàctil amb el mètode FindById.

Si el mètode FindById torna cert, encara es troba en estat tàctil, així que obteniu la posició tàctil de la propietat TouchLocation.Position i configureu-la a la classe de targeta. Si el mètode FindById retorna fals, el toc s'allibera, de manera que configureu Card.ID a 0 i configureu-lo com ningú no el toca.

Programa - Targetes de dibuix

Els paràmetres necessaris per dibuixar ja s'han d'establir a la classe Card, de manera que no hi ha res de nou.

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

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

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

Resum d'aquesta mostra

Aquesta vegada, he intentat crear un programa d'imatges que utilitzi multitàctil per moure objectes realment al joc. També vam observar que quan s'arrossegaven diverses targetes al mateix temps utilitzant l'identificador de la informació tàctil, el moviment de les targetes era constant fins i tot si l'altre dit s'aixecava o es tornava a tocar.

Aquesta mostra és només una mostra i només es realitza un processament senzill. Tanmateix, la part bàsica de l'operació multitàctil del tauler tàctil hauria d'estar coberta per la programació real del joc, així que apliqueu-la al processament multitàctil que s'adapti al vostre joc en funció d'això.