Windows.Xbox.Input から GameInput への移植
Windows.Xbox.Input
は、GDK以前の Xbox One ソフトウェア開発キット開発用の入力 APIです。 概念的には、GameInput
ではデバイスおよび入力読み取り値がさまざまな形で表されます。 このトピックでは、Windows.Xbox.Input
と GameInput
の主な相違点について説明します。
入力中心とデバイス中心
Windows.Xbox.Input
と GameInput
の主な違いとしては、前者では最初にデバイスと各デバイスのプロパティとして入力状態を収集する必要があります。 それとは対照的に、GameInput
では、デバイスが関連付けられている、フィルタリング可能な入力読み取り値のストリームが出発点となります。
A ボタン押下の検索
多くの場合、ゲームは最初に起動されるときに、続行する準備ができていることを示す A ボタンを押すようユーザーに求めます。 この例では、Windows.Xbox.Input
と GameInput
での手順を比較します。 この例ではゲームパッドのみを検索します。 例は例示目的のために簡略化されています。
Windows.Xbox.Input
次のコード例では、まずシステムに接続されているすべてのゲームパッドを列挙し、それを gamepads
ベクトルに格納します。 次に、ループ内で gamepads
を反復処理し、それぞれの現在の入力読み取り値を調べて、各読み取り値に A がないかどうかを確認します。
注意
このコードは、以前の API を参照しています。 これらの呼び出しは GameInput
にはありません。
void PollGamepadInput()
{
// Find all gamepads.
IVectorView<IGamepad^>^ gamepads = Gamepad::GetGamepads();
// Cycle through each gamepad.
for ( unsigned int i = 0; i < gamepads->Size; ++i )
{
// Get the gamepad's current reading.
IGamepadReading^ reading = gamepads->GetAt(i)->GetCurrentReading();
if ( reading->IsAPressed )
{
// Logic for the A button being pressed.
}
}
}
このモデルは改善することができます。 ゲームはシステムに接続されているさまざまなデバイスのコピーを保存する必要があります。 開発者は各デバイスの仕様を理解する必要があります。 また、すべてのゲームパッドのローカル コピーを保存することにより、コードは最新の読み取り値を取得するのではなく、時間経過に伴う状態も取得することになります。
GameInput
次のコード例では、コードは任意のデバイスからの最新のゲームパッドの読み取り値を探します。
GameInputKind フィルタを GamePad
に設定して GetCurrentReading を呼び出すことにより、コードは m_gameInput
にゲームパッドの読み取り値のみを返すように要求します。 次に、コードで読み取り値の状態をクエリし、A が押されているかどうかを確認します。
どのゲームパッドと対話しているかを追跡することもできます。 より完全な例については、「GameInput の読み取り値」を参照してください。
IGameInput* g_gameInput = nullptr;
HRESULT InitializeInput()
{
return GameInputCreate(&g_gameInput);
}
void PollGamepadInput()
{
ComPtr<IGameInputReading> reading;
// Get the most current gamepad reading, not filtering by a specific device.
// An error from the GetReading method indicates that no gamepad readings
// were found.
if (SUCCEEDED(g_gameInput->GetCurrentReading(GameInputKindGamepad, nullptr, &reading)))
{
// Read the gamepad state.
GameInputGamepadState state;
reading->GetGamepadState(&state);
if (state.buttons & GameInputGamepadA)
{
// Logic for the A button being pressed.
}
}
}
注意
GameInput
では、デバイスを繰り返し処理して各読み取り値を確認する必要はありません。 1 つのメソッド呼び出しで入力の最新状態を確認できます。 開発者は、各物理デバイスについて取得する情報量を制御できます。