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 触控适配