触摸操作在Windows手机7游戏开发第2部分多点触控

更新页 :
页面创建日期 :

编程! - 2. 尝试多点触控

关于此示例

在这里,我想解释一个程序,以实现多点触控输入。 在 Windows Phone 7 中,触摸屏多点触控输入是用户输入的重要项目之一。 这是因为与 Windows 和 Xbox 360 不同,主要输入界面是“触摸屏”。 带有键盘的 Windows 电话可能会出现,但当然,它们并不总是可用。 因此,要使游戏在任何 Windows 电话上工作,您需要支持触摸屏。

如果触摸屏仅限于“单触”,则创建游戏时,您不可避免地可以制作的游戏类型将受到限制。 记住便携式游戏机(可以放在一边)。 我认为大多数游戏机需要同时按下多个按钮,用双手握住游戏控制器(或实际设备)。

在 Windows Phone 7 中,没有像游戏控制器那样的按钮,并且可能没有键盘。 因此,有时在屏幕上放置虚拟键或按钮,因此,如果您按下它们,则仅通过一键就无法同时按下它们,因此不方便。

当然,不仅上述虚拟按钮示例,而且多点触控中常见的“捏合、拉伸(在两点之间靠近或释放操作)”或多人操作单个屏幕的游戏需要多点触控。

现在,前面的介绍已经变长了,但在这个示例中,我想使用触摸屏专用类来获取多点触控信息。 创建一个可以突然玩多点触控的示例很有趣,但首先,我想看看多点触控可以获取哪些信息。 有一些习惯,所以当你不能很好地工作在以后的编程,通过提前知道他们,我认为减少时间,你花时间去追求的原因。

此示例程序的目标

显示多点触控时的信息并确认。

図 1 :タッチしたときにタッチ情報がテキストで表示される
图 1:触摸时触摸信息以文本形式显示

程序 - 声明字段

在字段中,声明“触摸面板资本结构”和“触摸集合结构”。

/// <summary>
///  スプライトでテキストを描画するためのフォント
/// </summary>
SpriteFont font;

/// <summary>
///  タッチパネルの機能情報
/// </summary>
TouchPanelCapabilities capabilities;

/// <summary>
///  取得したタッチ情報の一覧
/// </summary>
TouchCollection touches;

触摸面板资本结构是一种结构,允许您将触摸屏本身的功能作为参数。 用于检查触摸屏在更新时是否可用。

触摸收集结构具有当前触摸状态的信息列表。 如果检测到多个触摸,则可以获取多个“触摸位置结构”。 稍后我们将更详细地讨论它。

程序 - 字体加载

在屏幕上绘制文本之前,请向内容项目添加字体定义,然后使用 Game.LoadContent 方法加载它。 由于这与触摸屏相关没有直接关系,因此省略了详细说明。

図 2 :コンテンツプロジェクトに「Font.spritefont」を追加しておく
图 2:将“字体.sprite 字体”添加到内容项目

// フォントをコンテンツパイプラインから読み込む
font = Content.Load<SpriteFont>("Font");

程序 - 获取触摸屏信息

在 Game.Update 方法中获取触摸屏信息。

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

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

您可以通过调用“触摸面板.Get 资本”方法来获取触摸屏的功能信息。 可以获取两个信息:“触摸屏是否可用”和“触摸屏可以获取的最大接触点数”。 我认为没有问题,如果你得到每个游戏.初始化方法,因为两者在游戏中不会改变,设备,如触摸屏删除在未来(实际设备以外的触摸屏和Windows电话可以USB连接)也描述在更新方法考虑的情况下出现。

此外,“触摸屏是否可用”在 Windows Phone 7 中始终可用,因此无需检查,但如果与 Windows 或 Xbox 360 共享代码,则这些硬件不是必填输入界面,因此需要检查。

在“触摸面板资本.IsConnected”属性中确认触摸屏可用后,使用“触摸面板.GetState”方法获取当前触摸状态。

最初,在获取触摸信息后,我们将执行一些操作,但此示例仅显示信息,因此 Game.Update 方法中没有进一步的操作。

程序 - 获取可获取的最大接触点数

由于可以获取的最大接触点数大致确定,因此在游戏中不需要检索最多,但您可以从“触摸面板.最大触摸计数”属性获取最大接触点数。 例如,如果 MaximumTouchCount 属性为“4”,则用五根手指触摸触摸屏无法获取第五个位置。

HTC 7 Trophy 是样品中使用的智能手机,获得的数量为 4。 (顺便说一下,XNA 游戏工作室 4.0 定义为始终返回 4。 Windows 电话 7 规范至少返回 4 磅,因此不会返回小于 4)

// タッチ可能な最大数を表示
spriteBatch.DrawString(font,  
                       "MaximumTouchCount : " +
                         capabilities.MaximumTouchCount,
                       new Vector2(20, 50),
                       Color.LightGreen);

図 3 :TouchPanelCapabilities.MaximumTouchCount プロパティの取得数
图 3 :TouchPanelCapabilities.MaximumTouchCount 属性的获取数

程序 - 获取触摸信息

检索到的“触摸集合”结构包含多个触摸信息。 例如,如果您用两根手指触摸,则通常包含两个触摸信息。

可以通过“触摸集合.Count”属性获取触摸信息的数量。 在 for 语句中重复显示获取的触摸信息数。 最初,在 foreach 中循环没有问题,但在后面的讨论中,我们使用数组索引 (int index),因此我们让 for 循环。

// タッチ情報の数だけループする
for (int index = 0; index < touches.Count; index++)
{
  // 指定したインデックスのタッチ情報取得
  TouchLocation tl = touches[index];

  // タッチ情報を可視化
  string mes = "Index : " + index + Environment.NewLine +
               "Id : " + tl.Id + Environment.NewLine +
               "Position : " + tl.Position + Environment.NewLine +
               "State : " + tl.State;

  // 文字の描画
  spriteBatch.DrawString(font,
                         mes,
                         new Vector2(30 + (index % 4) * 10,
                                     80 + index * 140),
                         Color.White);
}

现在,每个触摸信息都作为“触摸位置”结构获取。 如果循环到 for,则可以在“触摸集合”中检索它。 (foreach 也可以直接获取“触摸位置”结构。

TouchLocation 结构可以检索四条信息,每个信息都显示在示例中。

实际运行时,将显示触摸信息,如下所示。 用三根手指触摸,显示三个触摸信息。 顺便说一下,用五根手指触摸时,您最多可以看到四根手指。 (最大购置数为 4)

図 4 :3 本の指でタッチしているところ
图 4:用三根手指触摸

程序 - 获取触摸信息时需要注意的 1(索引和 ID)

我提到在处理上述触摸信息时需要注意的事项,但首先是索引和 ID。 索引只是数组的索引。

我认为,在实际机器上尝试比在句子中解释更容易理解。 例如,使用两个手指(食指)和中指操作,然后首先用食指触摸。

図 5 :人差し指でタッチ
图 5:用食指触摸

屏幕上显示的索引为“0”。 然后用中指触摸。

図 6 :中指でタッチ
图 6:用中指触摸

在此状态下,您用两根手指触摸,因此您将看到两条信息。 用中指触摸的索引为“1”。

让我们在这里放开食指。 然后,触摸信息如下所示。

図 7 :人差し指を放す
图 7:松开食指

您可能已经注意到,到目前为止,用中指触摸的信息的索引为“0”。 如果在移动字符时使用索引进行管理,则前面的操作将导致以下行为:

用食指移动字符“A”

• 在该状态下用中指移动角色“B”

用中指移动角色时释放食指

用中指操作的字符突然切换到“A”

另一种症状是,当您触摸两根手指时,重复释放或触摸其中一个手指时,第一个触摸信息的绘图字符可能会闪烁。 这是因为在第二个手指触摸或释放手指的瞬间,索引“0”被中断。

如上所述,多点触控索引和触摸信息的顺序与触摸顺序不匹配。 因此,在执行任何操作时,不应使用触摸集合索引进行管理

那么,为什么应该管理它呢?“TouchLocation”结构有一个“Id”属性,Id每次重新触摸时都会重写为新值,但触摸点和 ID 之间的关系是有保证的,所以我们将在这里管理它。

当然,这并不意味着您必须始终使用 ID 进行管理,在某些情况下,触摸位置可以很好地管理。 例如,如果您只需触摸屏幕上的按钮,即可在触摸位置检查按钮,而不涉及 ID。然后,您可以确定您按下了该按钮。 但是,我认为,如果包含拖动过程等,位置会始终更改,因此仍应使用 ID 进行区分。

程序 - 获取触摸信息时需要注意的 2(获取触摸信息的数量)

它未放入本文的程序中,但示例在屏幕底部绘制了“同时获取的最大触摸信息数”,以及字符串“GetMaxTouchCount”。 这在过去显示使用 TouchPanel.GetState 方法获取的最大触摸信息数,但在此测试器中,“触摸面板资本.MaximumTouchCount”属性为 4,因此此处显示的最大数字通常为 4。 即使我把五根手指放在抽屉里,我也会变成四根。

図 8 :5 本の指を置いたときの数値
图 8:放置五根手指时的数字

现在,让我们尝试一下。 尝试用多根手指快速触摸触摸屏。 根据测试机,在你知道之前,数字可能会超过4。

図 9 :GetMaxTouchCount が 4 を超えている
图 9:获取最大触摸计数大于 4

事实上,使用 TouchPanel.GetState 方法获取的触摸信息不是调用 TouchPanel.GetState 方法时的触摸信息,而是从上次更新计时触摸的瞬间、释放的瞬间等。 因此,尽管可以同时检测到最多四个触摸,但即使触摸同一手指,也会将其视为单独的触摸,因此可能会检索超过 TouchPanel 卡帕比利蒂斯.MaximumTouchCount 的触摸信息数。

因此,如果 TouchPanel 资本计数为 4,并且与触摸相关的数据的数组元素数固定为 4,则根据处理方式,可能会发生索引溢出错误。

顺便说一下,在 XNA 游戏工作室帮助中,Touch 集合.Count 属性的最大值为“8”,因此,如果要固定数组中的元素数,请将元素数设置为 8,这样您就放心了。 (如果您正在考虑将来的版本升级,则可能需要添加保护子句,以防止索引过度。

此示例摘要

这一次,我检查了从多点触控获得的信息的各种参数。 我们还确认,在获取触摸屏信息时,需要注意一些事项。 基于这些知识,我想解释一个实际使用多点触控的示例。