アーケード スティック
このページでは、Windows.Gaming.Input.ArcadeStick とユニバーサル Windows プラットフォーム (UWP) 用の関連 API を使った、アーケード スティックを対象にしたプログラミングの基礎について説明します。
ここでは、次の項目について紹介します。
- 接続されているアーケード スティックとそのユーザーの一覧を収集する方法
- アーケード スティックが追加または削除されたことを検出する方法
- 1 つ以上のアーケード スティックから入力を読み取る方法
- UI ナビゲーション デバイスとしてのアーケード スティックの動作
アーケード スティックの概要
アーケード スティックは、据え置き型アーケード マシンの操作感の再現と、高精度なデジタル制御が特長の入力デバイスです。 アーケード スティックは、直接対戦やその他のアーケードスタイルのゲームに最適な入力デバイスであり、オールデジタル制御で適切に動作するあらゆるゲームに適しています。 アーケード スティックは、Windows 10 または Windows 11 用の UWP アプリと Xbox One アプリで、Windows.Gaming.Input 名前空間を介してサポートされます。
アーケード スティックは、8 方向のデジタル ジョイスティック、6 個の操作ボタン (下の図の A1 から A6)、および 2 個の特殊ボタン (S1 と S2) を搭載しています。完全デジタル入力デバイスで、アナログ制御やバイブレーションはサポートしていません。 アーケード スティックには、UI 操作のサポートに使用するビューとメニューのボタンも搭載されていますが、それらはゲームプレイ コマンドのサポートを意図したものではなく、ジョイスティック ボタンとしてすぐに利用できるものではありません。
UI ナビゲーション
ユーザー インターフェイス ナビゲーションのために多くの異なる入力デバイスをサポートする負担を軽くし、ゲームとデバイスの間の一貫性を促進するために、ほとんどの "物理" 入力デバイスは、UI ナビゲーション コントローラーと呼ばれる別の "論理" 入力デバイスとして同時に機能します。 UI ナビゲーション コントローラーは、各種入力デバイスに共通の UI ナビゲーション コマンドのボキャブラリを提供します。
UI ナビゲーション コントローラーとして、アーケード スティックは、ナビゲーション コマンドの必須セットをジョイスティックとビュー ボタン、メニュー ボタン、アクション 1 ボタン、およびアクション 2 ボタンにマップします。
ナビゲーション コマンド | アーケード スティック入力 |
---|---|
上へ | スティックを上 |
[下へ] | スティックを下 |
Left | スティックを左 |
Right | スティックを右 |
ビュー | View ボタン |
メニュー | Menu ボタン |
同意する | アクション 1 ボタン |
キャンセル | アクション 2 ボタン |
アーケード スティックでは、ナビゲーション コマンドのオプションのセットはマップされません。
アーケード スティックの検出と追跡
アーケード スティックの検出と追跡の方法はゲームパッドの場合とまったく同じですが、Gamepad クラスの代わりに ArcadeStick クラスを使用する点だけが異なります。 詳細については、「ゲームパッドと振動」を参照してください。
アーケード スティックの読み取り
目的のアーケード スティックを特定したら、それらから入力を収集する準備が整います。 ただし、慣れている他の種類の入力とは異なり、アーケード スティックはイベントを発生させることで状態変化を伝えるのではありません。 代わりに、イベントをポーリングすることで現在の状態を定期的に読み取ります。
アーケード スティックのポーリング
ポーリングによって、アーケード スティックのある正確な時点のスナップショットが取得されます。 入力収集に対するこのアプローチは、ほとんどのゲームに適しています。通常、そのロジックがイベントドリブンではなく確定的なループで実行されるためです。また、一般にゲーム コマンドを解釈するのは、一度に収集された入力からの方が、時間の経過につれて収集される多数の単一の入力からよりも簡単です。
GetCurrentReading を呼び出してアーケード スティックをポーリングします。この関数は、アーケード スティックの状態を含む ArcadeStickReading を返します。
次の例では、アーケード スティックの現在の状態をポーリングします。
auto arcadestick = myArcadeSticks[0];
ArcadeStickReading reading = arcadestick->GetCurrentReading();
各読み取りには、アーケード スティックの状態に加えて、その状態がいつ取得されたかを正確に示すタイムスタンプが含まれます。 このタイムスタンプは、以前の読み取りのタイミングや、ゲームのシミュレーションのタイミングと関連付けに便利です。
ボタンの読み取り
アーケード スティックの各ボタン (ジョイスティックの 4 方向、6 個の操作ボタン、2 個の特殊ボタン) は、デジタルの読み取り値によって、押されている (ダウン) か離されている (アップ) かを示します。 効率を高めるため、ボタンの読み取り値は個別のブール値としては表されません。代わりに、すべてが、ArcadeStickButtons 列挙型で表される単一のビットフィールドにパックされます。
Note
アーケード スティックには、ビュー ボタンやメニュー ボタンなど、他にも UI 操作に使用するボタンが搭載されています。 これらのボタンは ArcadeStickButtons
列挙体には含まれず、UI ナビゲーション デバイスとしてアーケード スティックにアクセスすることによってのみ読み取ることができます。 詳細については、「UI ナビゲーション デバイス」を参照してください。
ボタンの値は、ArcadeStickReading 構造体の Buttons
プロパティから読み取ります。 このプロパティはビットフィールドであるため、ビット演算子マスクを使用して目的のボタンの値を分離します。 対応するビットが設定されているときはボタンが押されており (ダウン)、それ以外の場合はボタンが離されています (アップ)。
次の例では、アクション 1 ボタンが押されているかどうかを判別します。
if (ArcadeStickButtons::Action1 == (reading.Buttons & ArcadeStickButtons::Action1))
{
// Action 1 is pressed
}
次の例では、アクション 1 ボタンが離されているかどうかを判別します。
if (ArcadeStickButtons::None == (reading.Buttons & ArcadeStickButtons::Action1))
{
// Action 1 is released (not pressed)
}
場合によっては、ボタンが押された状態から離された状態への移行またはその逆方向への移行のタイミング、複数のボタンが押されているか離されているかの状態、または一連のボタンが特定のパターンの状態になっているかどうか (一部が押されていて、一部が押されていない) を特定する必要があります。 これらの状態を検出する方法の詳細については、「ボタン移行の検出」および「複雑なボタン配置の検出」を参照してください。
InputInterfacing サンプルを実行する
InputInterfacingUWP サンプル (github) では、アーケード スティックとさまざまな種類の入力デバイスを並行して使用する方法や、それらの入力デバイスが UI ナビゲーション コントローラーとしてどのように動作するかを示します。