次の方法で共有


XGameStreamingGetGamepadPhysicality

特定のゲームパッド読み取りから入力物理マッピングを取得します。

構文

HRESULT XGameStreamingGetGamepadPhysicality(
         IGameInputReading* gamepadReading,
         XGameStreamingGamepadPhysicality* gamepadPhysicality
)

パラメーター

gamepadReading _In_
型: IGameInputReading*

クエリされているゲームパッドの読み取り値。

gamepadPhysicality _Out_
型: XGameStreamingGamepadPhysicality*

入力読み値の物理値。

戻り値

型: HRESULT

成功した場合は S_OK を返し、それ以外の場合はエラー コードを返します。

返される可能性のあるエラー

エラー コード エラー値 エラーの原因
E_GAMESTREAMING_NOT_INITIALIZED 0x89245400 XGameStreaming ランタイムが初期化されていません。 他の API を呼び出す前に XGameStreamingInitialize を呼び出してください。
E_GAMESTREAMING_NOT_STREAMING_CONTROLLER 0x89245404 現在の読み取り値は、ストリーミング コントローラーからのものではありません。

解説

ゲームは、入力が物理的に接続されたコントローラーから入力されたか仮想コントローラー入力に変換されたタッチ レイアウトから入力されたかに基づいて、コントローラーの入力を区別する必要がある場合があります。

シナリオ例

ゲームには、A ボタンに関連付けられている「ジャンプ」アクションがあります。 これは、仮想コントローラーで A ボタンを押すアクションに設定されている「ジャンプ」アイコンを使用してタッチ レイアウトを提供します。 ゲームでは、「A」が「ジャンプ」と関連しなくなるように、プレイヤーが物理コントローラーを再マッピングできる機能も提供されます。

このゲームは、ゲーム内の要素とやり取りするための視覚的なヒントを表示することができます (A を押すアクションが「ジャンプ」など)。 プレイヤーがタッチ レイアウトを使用している場合、ゲームは視覚的なヒントを表示して、タッチ レイアウトのボタンのアイコンを示すことになっています。

次のコード例では、既定でジャンプ アクションが、コントローラーの A ボタンにリンクされています。 この設定はプレーヤーによってカスタマイズ可能ですが、画面のタッチ レイアウトは固定されているため、タッチ レイアウトで A ボタンを押した場合は、常にジャンプとして扱われることになります。一方、物理コントローラーの A ボタンは、コントローラー マッピング カスタマイズでプレーヤーが設定した動作として扱われることになります。

void Game::Update(DX::StepTimer const& timer)
{
    g_gameInput->GetCurrentReading(GameInputKind::GameInputKindController, g_gamepad, &reading);
    
    GameInputGamepadState state;
    reading->GetGamepadState(&state);

    XGameStreamingGamepadPhysicality physicality = XGameStreamingGamepadPhysicality::None;
    
    HRESULT hr = XGameStreamingGetGamepadPhysicality(reading, &physicality);

    if ((state.buttons & GameInputGamepadA) != GameInputGamepadNone)
    {
        if (SUCCEEDED(hr))
        {
            if ((physicality & XGameStreamingGamepadPhysicality::AVirtual) == 
                XGameStreamingGamepadPhysicality::AVirtual)
            {
                // 'A' Input came from touch layout
                // Perform 'jump' action, if applicable
            }
            else if ((physicality & XGameStreamingGamepadPhysicality::APhysical) == 
                 XGameStreamingGamepadPhysicality::APhysical)
            {
                // 'A' Input came from the physical controller.
                // Lookup 'A' from the user's customized controller mapping.
                // Perform whatever action A is mapped to, if applicable.
            }
        }
        else
        {
            // Physicality not present on this gamepad.
            // Perform input 'A' action as if there were no stream.
        }
    }

    // UI icon updates.
    // If the player is using the touch layouts, then show touch iconography, 
    // otherwise switch to the physical controller iconography.
    if (SUCCEEDED(hr))
    {
        if ((physicality & XGameStreamingGamepadPhysicality::AllVirtual) != 
            XGameStreamingGamepadPhysicality::None)
        {
            // At least one input is coming from virtual touch layout.
            // Update UI icons to match the touch layouts.
        } 
        else 
        {
            if ((physicality & XGameStreamingGamepadPhysicality::AllPhysical) != 
                XGameStreamingGamepadPhysicality::None)
            {
                // At least one input is coming from a physical controller.
                // Update UI icons to match a physical controller inputs (for example, LT/LB/RT/RB icon).
            }
        }
    }
    else
    {
        // Use the default non-streaming behavior for UI icons 
    }
}

要件

ヘッダー: xgamestreaming.h

ライブラリ: xgameruntime.lib

サポートされているプラットフォーム: Windows、Xbox One ファミリー本体、Xbox Series 本体

関連項目

XGameStreaming
XGameStreamingGamepadPhysicality
XGameStreaming タッチ アダプテーション