触摸操作在Windows手机7游戏开发第3部分拖动操作

更新页 :
页面创建日期 :

编程! - 3. 尝试移动卡以匹配触摸

关于此示例

这一次,我想创建一个专业版,将四张卡放在屏幕上,然后将卡片放在您触摸的位置。 这是程序的多点触控版本,首先在 Mouse 类中拖动子画面。 到目前为止,有很多解释,所以这次我想以程序为中心来解释它。

此示例程序的目标

同时拖动多点触控触摸的多张卡。

図 1 :マルチタッチによるドラッグ操作
图 1:多点触控拖动操作

程序 - 卡类

多点触控需要具有多个对象,因此我想创建一个“卡”类,将移动的子画面作为“卡”。

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

为了不成为过于复杂的代码,我们确保卡片类具有三个属性:触摸 ID、位置和颜色。 没有具体说明,但“触摸 ID”用于检查与哪个接触点相关联。

程序 - 声明字段

没有什么新的东西,除了有一个卡类数组来拥有卡信息。 这一次,它就像一个示例的应用,直到现在。 我们制作了四张卡片,每张卡片都有不同的颜色,以便在绘制时显示差异。

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

程序 - 获取触摸信息

在游戏.更新方法中。 这里没有特别的新点,因为它是一个样例。

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

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

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

程序 - 触摸时将触摸 ID 与卡关联

在示例程序中,从处理成本的角度来看,顺序是相反的,但在这里解释它更容易理解,所以我会先解释它。

首先,在 foreach 中循环访问检索到的触摸集合以获取每个信息。

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

检查“触摸位置.状态”属性,如果为“触摸位置状态.Pressed”,则表示这是触摸的时刻。

由于此示例将卡的 ID 定义为“0”,则不使用“卡”。 Where(c => c.Id == 0). 在“第一个十一()”中,我搜索了一张 ID 为 0 的卡,并在找到该卡时检索该卡。 如果未找到,则返回 null。 为了简化代码,我们使用 LINQ 调用扩展方法,但如果您关心处理成本,则可以在 for 循环中逐个搜索。

找到卡后,将触摸 ID 和触摸位置放在卡片上。

程序 - 触摸时处理卡,释放时处理

触摸时,始终将卡置于拖动状态,并在释放时断开触摸点与卡之间的关联。

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

在 foreach 中循环访问卡列表,并处理每个卡。 如果 ID 不是 0,则与接触点关联,因此继续处理。

触摸集合结构提供 FindById 方法,如果存在指定的 ID,则可以获取触摸信息。 Card.Id 属性不为零,则可以假定它与某个接触点相关联,因此尝试使用 FindById 方法获取触摸信息。

如果 FindById 方法返回 true,则仍处于触摸状态,因此从触摸位置.位置属性获取触摸位置并将其设置为卡类。 如果 FindById 方法返回 false,则释放触摸,因此将 Card.ID 设置为 0,以便没有人触摸它。

程序 - 绘制卡片

绘图所需的参数应已在 Card 类中设置,因此没有特别新内容。

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

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

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

此示例摘要

这一次,我尝试编写一个图像程序,使用多点触控来实际移动游戏中的对象。 此外,当使用触摸信息 ID 同时拖动多张卡时,我们还可以确保即使松开或重新触摸其他手指,卡的移动也不会发生冲突。

此示例只是一个示例,并且仅执行简单的处理。 但是,在实际游戏编程中,触摸屏多点触控操作的基本部分应该有效,因此请尝试将其应用于适合您游戏的多点触控处理。