触摸操作在Windows手机7游戏开发第3部分拖动操作
编程! - 3. 尝试移动卡以匹配触摸
关于此示例
这一次,我想创建一个专业版,将四张卡放在屏幕上,然后将卡片放在您触摸的位置。 这是程序的多点触控版本,首先在 Mouse 类中拖动子画面。 到目前为止,有很多解释,所以这次我想以程序为中心来解释它。
此示例程序的目标
同时拖动多点触控触摸的多张卡。
图 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 同时拖动多张卡时,我们还可以确保即使松开或重新触摸其他手指,卡的移动也不会发生冲突。
此示例只是一个示例,并且仅执行简单的处理。 但是,在实际游戏编程中,触摸屏多点触控操作的基本部分应该有效,因此请尝试将其应用于适合您游戏的多点触控处理。