電動搖桿

本頁說明如何使用 Windows.Gaming.Input.ArcadeStick,以及適用於通用 Windows 平台 (UWP) 的相關 API 來編寫街機遊戲的基本程式。

透過閱讀此頁,您將瞭解:

  • 如何收集連線街機搖桿及其使用者清單
  • 如何偵測街機搖桿是否已被新增或移除
  • 如何讀取一或多個街機搖桿的輸入
  • 街機搖桿如何作為 UI 導覽裝置

街機搖桿概覽

街機搖桿是用來再現直立街機感覺的輸入裝置,並用於其高精度的數位控制。 街機搖桿是正面對打遊戲和其他街機風格遊戲的完美輸入裝置,適用於任何能與全數位控制配合的遊戲。 Windows 10 或 Windows 11 的 UWP 應用程式和 Xbox One 應用程式都透過 Windows.Gaming.Input namespace 支援街機搖桿。

街機搖桿配備八向數位搖桿、六個 Action button (在下圖中表示為 A1-A6) 和兩個 Special 按鈕 (表示為 S1 和 S2);它們是全數位輸入裝置,不支援模擬控制或振動。 街機搖桿還配備 View 和 Menu 按鈕,用於支援 UI 導航,但它們並不用於支援遊戲命令,並且不能作為搖桿按鈕輕鬆存取。

Arcade stick with 4-directional joystick, 6 action buttons (A1-A6), and 2 special buttons (S1 and S2)

UI 導覽

為減輕支援許多不同的輸入裝置用於使用者介面導航的負擔,並鼓勵遊戲和裝置之間的一致性,大多數物理輸入裝置同時充當單獨的邏輯輸入裝置,稱為 UI 導航控制器。 該 UI 導航控制器提供跨輸入裝置的 UI 導航命令的公共辭彙。

作為 UI 導覽控制器,街機將所需的導覽指令集對映至搖桿和 View、Menu、Action 1 Action 2。

導覽命令 街機搖桿輸入
向上 搖桿向上
向下 搖桿向下
Left 搖桿向左
Right 搖桿向右
檢視 檢視按鈕
功能表 功能表按鈕
Accept Action 1 按鈕
取消 Action 2 按鈕

街機搖桿會對應任何選擇的導覽指令集。

偵測並追蹤街機搖桿

偵測和追蹤街機搖桿的工作方式與遊戲板完全相同,除 ArcadeStick class 而不是 Gamepad class。 請參閱 Gamepad and vibration,以取得更多資訊。

閱讀街機搖桿

識別出感興趣的街機搖桿之後,你就可以收集輸入值。 然而,與一些其他型別的輸入不同的是,街機搖桿不透過引發事件來傳達狀態變化。 相反,你透過輪詢 來定期檢視他們目前的狀態。

輪詢街機搖桿

輪詢會在精確的時間點擷取街機搖桿的快照。 這種輸入收集方法非常適合大多數遊戲,因為它們的邏輯通常運行在一個確定性的循環中,而不是事件驅動的;從一次收集的輸入解釋遊戲命令通常也比從隨時間而收集的許多單個輸入解釋更加簡單。

您可以呼叫 GetCurrentReading,來輪詢街機搖桿;此函式會傳回包含街機搖桿狀態的 ArcadeStickReading。

下列範例會輪詢街機搖桿目前的狀態。

auto arcadestick = myArcadeSticks[0];

ArcadeStickReading reading = arcadestick->GetCurrentReading();

除街機搖桿狀態之外,每個讀數都包括一個時間戳,精確地表示狀態檢索的時間。 時間戳記對於與先前的讀數的時序或遊戲模擬的時序相關是有用的。

正在讀取按鈕

每個街機搖桿按鈕,搖桿四個方向、六個動作按鈕和兩個特殊按鈕,提供數位讀數,指示是按下 (下) 還是釋放 (上)。 為提高效率,按鈕讀數不是以個別的布林值來表示;而是全部封裝到由 ArcadeStickButtons 列舉表示的單一位元欄位中。

注意

街機搖桿配備額外的按鈕來進行 UI 導覽,例如 View (檢視) 和 Menu (功能表) 按鈕。 這些按鈕不是ArcadeStickButtons列舉的一部分,只能透過存取街機搖桿作為 UI 導覽裝置來讀取。 如需詳細資訊,請參閱 UI導覽裝置。

按鈕值是從 ArcadeStickReading Buttons結構的屬性中讀取的。 因為這個屬性是位元欄位,所以會使用位元遮罩來隔離您感興趣的按鈕值。 當設定相應的位時,按鈕被按下 (下);否則,會被釋放 (上)。

下列範例會決定是否按下 Action 1 按鈕。

if (ArcadeStickButtons::Action1 == (reading.Buttons & ArcadeStickButtons::Action1))
{
    // Action 1 is pressed
}

下列範例會決定是否釋放 Action 1 按鈕。

if (ArcadeStickButtons::None == (reading.Buttons & ArcadeStickButtons::Action1))
{
    // Action 1 is released (not pressed)
}

有時您可能想要判斷按鈕何時從按壓轉換為鬆開或鬆開轉換為按壓,是否按多個按鈕或鬆開多個按鈕,或者是否以特定方式排列一組按鈕 (有些按下,有些不按下)。 有關如何偵測這些情況的資訊,請參閱偵測按鈕切換和偵測複雜的按鈕排列。

執行 InputInterfacing 範例

InputInterfacing UWP 範例 (github),示範如何使用街機搖桿和不同種類的輸入裝置,以及這些輸入裝置如何作為 UI 導航控制器。

另請參閱