アーケード スティックArcade stick

このページでは、Windows.Gaming.Input.ArcadeStick とユニバーサル Windows プラットフォーム (UWP) 用の関連 API を使った、Xbox One アーケード スティックを対象にしたプログラミングの基礎について説明します。This page describes the basics of programming for Xbox One arcade sticks using Windows.Gaming.Input.ArcadeStick and related APIs for the Universal Windows Platform (UWP).

ここでは、次の項目について紹介します。By reading this page, you'll learn:

  • 接続されているアーケード スティックとそのユーザーの一覧を収集する方法how to gather a list of connected arcade sticks and their users
  • アーケード スティックが追加または削除されたことを検出する方法how to detect that an arcade stick has been added or removed
  • 1 つ以上のアーケード スティックの入力を読み取る方法how to read input from one or more arcade sticks
  • アーケードスティックが UI ナビゲーションデバイスとして動作するしくみhow arcade sticks behave as UI navigation devices

アーケード スティックの概要Arcade stick overview

アーケード スティックは、店頭のアーケード マシンの雰囲気を再現し、デジタルにより高い精度で制御できる入力デバイスです。Arcade sticks are input devices valued for reproducing the feel of stand-up arcade machines and for their high-precision digital controls. アーケード スティックは、格闘ゲームなどのアーケード ゲームに最適な入力デバイスで、完全デジタル制御に対応しているあらゆるゲームに適しています。Arcade sticks are the perfect input device for head-to-head-fighting and other arcade-style games, and are suitable for any game that works well with all-digital controls. アーケード スティックは、Windows 10 および Xbox One UWP アプリで Windows.Gaming.Input 名前空間によってサポートされています。Arcade sticks are supported in Windows 10 and Xbox One UWP apps by the Windows.Gaming.Input namespace.

Xbox One のアーケードスティックは、8ウェイのデジタルジョイスティック、6つの アクション ボタン (下図では A1-A6 として表されます)、2つの 特殊な ボタン (S1 と S2 で表されます) を備えています。アナログコントロールや振動をサポートしていないすべてのデジタル入力デバイスです。Xbox One arcade sticks are equipped with an 8-way digital joystick, six Action buttons (represented as A1-A6 in the image below), and two Special buttons (represented as S1 and S2); they're all-digital input devices that don't support analog controls or vibration. Xbox One のアーケードスティックには、UI ナビゲーションをサポートするために使用される 表示 ボタンと メニュー ボタンも用意されていますが、ゲームプレイコマンドをサポートするためのものではなく、ジョイスティックボタンとして簡単にアクセスすることはできません。Xbox One arcade sticks are also equipped with View and Menu buttons used to support UI navigation but they're not intended to support gameplay commands and can't be readily accessed as joystick buttons.

4方向のジョイスティックを備えたアーケードスティック、6つのアクションボタン (A1 ~ A6)、2つの特殊ボタン (S1 および S2)

UI のナビゲーションUI navigation

ユーザー インターフェイスの操作にさまざまな入力デバイスをサポートする負担を軽くし、ゲームとデバイス間の整合性を高めるため、ほとんどの物理__ 入力デバイスは、UI ナビゲーション コントローラーと呼ばれる個別の論理__ 入力デバイスとして同時に機能します。In order to ease the burden of supporting many different input devices for user interface navigation and to encourage consistency between games and devices, most physical input devices simultaneously act as a separate logical input device called a UI navigation controller. UI ナビゲーション コントローラーは、各種入力デバイスに共通の UI ナビゲーション コマンドのボキャブラリを提供します。The UI navigation controller provides a common vocabulary for UI navigation commands across input devices.

UI ナビゲーションコントローラーとして、アーケードスティックは、 必要な一連 のナビゲーションコマンドをジョイスティックと 表示メニューアクション 1、および アクション 2 の各ボタンにマップします。As a UI navigation controller, arcade sticks map the required set of navigation commands to the joystick and View, Menu, Action 1, and Action 2 buttons.

ナビゲーション コマンドNavigation command アーケード スティック入力Arcade stick input
上へUp スティックを上Stick up
[下へ]Down スティックを下Stick down
LeftLeft スティックを左Stick left
RightRight スティックを右Stick right
表示View 表示ボタンView button
メニューMenu メニュー ボタンMenu button
承諾Accept アクション 1 ボタンAction 1 button
キャンセルCancel アクション 2 ボタンAction 2 button

アーケード スティックは、ナビゲーション コマンドのオプション セットはマップしません。Arcade sticks don't map any of the optional set of navigation commands.

アーケード スティックの検出と追跡Detect and track arcade sticks

アーケードスティックの検出と追跡は、ゲームパッドの場合とまったく同じ方法で動作します。ただし、ゲームパッドクラスではなくArcadeStickクラスを使用します。Detecting and tracking arcade sticks works in exactly the same way as it does for gamepads, except with the ArcadeStick class instead of the Gamepad class. 詳細については、「ゲームパッドと振動」を参照してください。See Gamepad and vibration for more information.

アーケード スティックの読み取りReading the arcade stick

目的のアーケード スティックを特定したら、入力を収集する準備は完了です。After you identify the arcade stick that you're interested in, you're ready to gather input from it. ただし、なじみのある一部の他の種類の入力とは違い、アーケード スティックはイベントを発生することによって状態の変化を伝えるわけではありません。However, unlike some other kinds of input that you might be used to, arcade sticks don't communicate state-change by raising events. 代わりに、イベントを_ポーリング_することで現在の状態を定期的に読み取ります。Instead, you take regular readings of their current state by polling them.

アーケード スティックのポーリングPolling the arcade stick

ポーリングでは、明確な時点におけるアーケード スティックのスナップショットをキャプチャします。Polling captures a snapshot of the arcade stick at a precise point in time. 入力を収集するこのアプローチはほとんどのゲームに最適です。ゲームのロジックはイベント駆動型ではなく、確定的なループの中で実行されることが一般的なためです。また通常は、徐々に集めた多数の単一の入力によるコマンドを解釈するより、一度に集めた入力によるゲーム コマンドを解釈する方が簡単になります。This approach to input gathering is a good fit for most games because their logic typically runs in a deterministic loop rather than being event-driven; it's also typically simpler to interpret game commands from input gathered all at once than it is from many single inputs gathered over time.

アーケード スティックをポーリングするには、GetCurrentReading を呼び出します。この関数はアーケード スティックの状態が格納された ArcadeStickReading を返します。You poll an arcade stick by calling GetCurrentReading; this function returns an ArcadeStickReading that contains the state of the arcade stick.

次の例では、アーケード スティックをポーリングして現在の状態を確認します。The following example polls an arcade stick for its current state.

auto arcadestick = myArcadeSticks[0];

ArcadeStickReading reading = arcadestick->GetCurrentReading();

読み取りデータには、アーケード スティックの状態だけでなく、正確にいつ状態が取得されたかを示すタイムスタンプも含まれます。 In addition to the arcade stick state, each reading includes a timestamp that indicates precisely when the state was retrieved. このタイムスタンプは、以前の読み取りのタイミングや、ゲームのシミュレーションのタイミングと関連付けに便利です。The timestamp is useful for relating to the timing of previous readings or to the timing of the game simulation.

ボタンの読み取りReading the buttons

各アーケードスティックボタンには、 — ジョイスティックの4つの方向、6つの アクション ボタン、および2つの 特殊 ボタンが表示 — されます。これは、押されている (下の) か、または離された (上の) かを示すデジタル読み取りです。Each of the arcade stick buttons—the four directions of the joystick, six Action buttons, and two Special buttons—provides a digital reading that indicates whether it's pressed (down) or released (up). 効率を上げるために、ボタンの読み取りは個々のブール値として表されません。これらはすべて、 ArcadeStickButtons 列挙体によって表される1つのビットフィールドにパックされています。For efficiency, button readings aren't represented as individual boolean values; instead, they're all packed into a single bitfield that's represented by the ArcadeStickButtons enumeration.


アーケードスティックには、 ビューメニュー ボタンなどの UI ナビゲーションに使用する追加のボタンが装備されています。Arcade sticks are equipped with additional buttons used for UI navigation such as the View and Menu buttons. これらのボタンは ArcadeStickButtons 列挙型には含まれず、UI ナビゲーション デバイスとしてアーケード スティックを利用する場合にしか、読み取られません。These buttons are not a part of the ArcadeStickButtons enumeration and can only be read by accessing the arcade stick as a UI navigation device. 詳しくは、「UI ナビゲーション デバイス」をご覧ください。For more information, see UI Navigation Device.

ボタンの値は、ArcadeStickReading 構造体の Buttons プロパティから読み取ります。The button values are read from the Buttons property of the ArcadeStickReading structure. このプロパティはビットフィールドであるため、ビット演算子マスクを使用して目的のボタンの値を分離します。Because this property is a bitfield, bitwise masking is used to isolate the value of the button that you're interested in. 対応するビットが設定されているときはボタンが押されており (ダウン)、それ以外の場合はボタンが離されています (アップ)。The button is pressed (down) when the corresponding bit is set; otherwise, it's released (up).

次の例では、 アクション 1 ボタンが押されているかどうかを判断します。The following example determines whether the Action 1 button is pressed.

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

次の例では、 アクション 1 ボタンが解放されているかどうかを判断します。The following example determines whether the Action 1 button is released.

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

場合によっては、ボタンが押された状態から離した状態に切り替えるか、または離された状態に切り替わるか、複数のボタンが押されたか離されたか、またはボタンのセットが特定の方法で並べ替えられているかどうかを判断する必要があり — ます。Sometimes you might want to determine when a button transitions from pressed to released or released to pressed, whether multiple buttons are pressed or released, or if a set of buttons are arranged in a particular way—some pressed, some not. これらの状態を検出する方法について詳しくは、「Detecting button transitions (ボタンの移行の検出)」および「Detecting complex button arrangements (複雑なボタンのパターンの検出)」をご覧ください。For information on how to detect these conditions, see Detecting button transitions and Detecting complex button arrangements.

InputInterfacing サンプルの実行Run the InputInterfacing sample

InputInterfacingUWP サンプル (github) は、アーケード スティックと、種類の異なる入力デバイスとを組み合わせて使用する方法と、これらの入力デバイスが UI ナビゲーション コントローラーとしてどのように動作するかを示します。The InputInterfacingUWP sample (github) demonstrates how to use arcade sticks and different kinds of input devices in tandem, as well as how these input devices behave as UI navigation controllers.

関連項目See also