觸摸操作在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同時拖動多張卡時,我們還可以確保即使鬆開或重新觸摸其他手指,卡的移動也不會發生衝突。
此示例只是一個範例,並且僅執行簡單的處理。 但是,在實際遊戲程式設計中,觸摸屏多點觸控操作的基本部分應該有效,因此請嘗試將其應用於適合您遊戲的多點觸控處理。