觸摸操作在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,這樣您就放心了。 (如果您正在考慮將來的版本升級,則可能需要添加保護子句,以防止索引過度。

此示例摘要

這一次,我檢查了從多點觸控獲得的信息的各種參數。 我們還確認,在獲取觸摸屏資訊時,需要注意一些事項。 基於這些知識,我想解釋一個實際使用多點觸控的示例。