> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# GameInput 上的力反馈

> GameInput 上的力反馈

本主题介绍 `GameInput` 上的力反馈如何管理设备输出。借助力反馈，游戏输入设备可以物理移动一个或多个输入控件，为用户提供触觉反馈。力反馈适用于模拟车辆操作的输入设备，例如方向盘和飞行模拟设备。这些设备包含一个力反馈电机，可沿某个轴向控制器施力。在赛车方向盘上，这是转动方向盘的旋转力，用于模拟游戏内场景。将力反馈用于飞行操纵杆时，可让操纵杆在特定位置难以推动或拉动。

有关支持力反馈的 `GameInput` 接口的更多信息，请参阅 [IGameInputDevice](/reference/input/gameinput/interfaces/igameinputdevice/igameinputdevice) 和 [IGameInputForceFeedbackEffect](/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/igameinputforcefeedbackeffect)。

## 检查力反馈电机

要创建力反馈效果，你需要表示要应用效果的输入设备的 [IGameInputDevice](/reference/input/gameinput/interfaces/igameinputdevice/igameinputdevice) 接口。获取 `IGameInputDevice` 接口后，通过检查 [GameInputDeviceInfo](/reference/input/gameinput/structs/gameinputdeviceinfo) 结构体来确认该设备上的力反馈电机数量。可通过调用 [IGameInputDevice::GetDeviceInfo](/reference/input/gameinput/interfaces/igameinputdevice/methods/igameinputdevice_getdeviceinfo) 实现。如果输入设备上有力反馈电机，[GameInputDeviceInfo](/reference/input/gameinput/structs/gameinputdeviceinfo) 的成员 `ForceFeedbackMotorCount` 的值将为 1 或更大。

## 创建力反馈效果

如果某设备的 [GameInputDeviceInfo](/reference/input/gameinput/structs/gameinputdeviceinfo) 结构体表明它具有一个或多个力反馈电机，则可通过调用 [IGameInputDevice::CreateForceFeedbackEffect](/reference/input/gameinput/interfaces/igameinputdevice/methods/igameinputdevice_createforcefeedbackeffect) 为该设备创建力反馈效果，如以下代码所示。

```cpp theme={null}
HRESULT CreateForceFeedbackEffect(  
         uint32_t motorIndex,  
         const GameInputForceFeedbackParams* params,  
         IGameInputForceFeedbackEffect** effect  
) 
```

电机索引参数是受力反馈影响的电机的索引。该索引对应于 [GameInputDeviceInfo](/reference/input/gameinput/structs/gameinputdeviceinfo) 结构体的 [GameInputForceFeedbackMotorInfo](/reference/input/gameinput/structs/gameinputforcefeedbackmotorinfo) 数组中的相应电机。该数组包含所存在力反馈电机及其功能的信息。

对于第二个参数，为力反馈效果构造 [GameInputForceFeedbackParams](/reference/input/gameinput/structs/gameinputforcefeedbackparams) 结构体，用于描述效果的特征，如以下代码所示。

```cpp theme={null}
typedef struct GameInputForceFeedbackParams {  
    GameInputForceFeedbackEffectKind kind;  
    union  
    {  
        GameInputForceFeedbackConstantParams constant;  
        GameInputForceFeedbackRampParams ramp;  
        GameInputForceFeedbackPeriodicParams sineWave;  
        GameInputForceFeedbackPeriodicParams squareWave;  
        GameInputForceFeedbackPeriodicParams triangleWave;  
        GameInputForceFeedbackPeriodicParams sawtoothUpWave;  
        GameInputForceFeedbackPeriodicParams sawtoothDownWave;  
        GameInputForceFeedbackConditionParams spring;  
        GameInputForceFeedbackConditionParams friction;  
        GameInputForceFeedbackConditionParams damper;  
        GameInputForceFeedbackConditionParams inertia;  
    };  
} 
```

选择一个 [GameInputForceFeedbackEffectKind](/reference/input/gameinput/enums/gameinputforcefeedbackeffectkind) 枚举值，然后初始化对应的 `GameInputForceFeedbackParams` 结构体。

例如，若要创建具有弹簧行为的反馈效果，[GameInputForceFeedbackParams](/reference/input/gameinput/structs/gameinputforcefeedbackparams) 由 [GameInputForceFeedbackEffectKind](/reference/input/gameinput/enums/gameinputforcefeedbackeffectkind) 值 `GameInputForceFeedbackSpring` 以及用于弹簧的 [GameInputForceFeedbackConditionParams](/reference/input/gameinput/structs/gameinputforcefeedbackconditionparams) 结构体组成。填入所选 [GameInputForceFeedbackEffectKind](/reference/input/gameinput/enums/gameinputforcefeedbackeffectkind) 枚举值对应的参数。

在按索引选择好力反馈电机效果并创建了 [GameInputForceFeedbackParams](/reference/input/gameinput/structs/gameinputforcefeedbackparams) 结构体后，调用 [IGameInputDevice::CreateForceFeedbackEffect](/reference/input/gameinput/interfaces/igameinputdevice/methods/igameinputdevice_createforcefeedbackeffect) 创建效果。它由 [IGameInputForceFeedbackEffect](/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/igameinputforcefeedbackeffect) 接口表示。

力反馈效果的生命周期与所创建的 [IGameInputForceFeedbackEffect](/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/igameinputforcefeedbackeffect) 接口相关联。创建效果时，会将其加载到设备。释放最后一个引用后，力反馈效果会停止，并从设备电机中卸载。

## 应用和更新力反馈效果

创建力反馈效果时，会直接加载到设备电机中。力反馈电机的内存有限，这限制了同时加载和播放的力反馈效果数量。达到此上限后调用 [IGameInputDevice::CreateForceFeedbackEffect](/reference/input/gameinput/interfaces/igameinputdevice/methods/igameinputdevice_createforcefeedbackeffect) 会导致该函数返回错误。

创建力反馈效果后，它会以已停止状态加载到力反馈电机。加载完成后，使用 [IGameInputForceFeedbackEffect](/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/igameinputforcefeedbackeffect) 接口将该效果的[状态设置](/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/methods/igameinputforcefeedbackeffect_setstate)为 `Running`。这会在设备电机上播放该效果。

### 力反馈效果的状态

力反馈效果会经过若干状态以匹配游戏的当前状态。务必根据游戏更新并留意效果的状态，以维持预期行为。

可以按照 [GameInputFeedbackEffectState](/reference/input/gameinput/enums/gameinputfeedbackeffectstate) 设置力反馈的状态，如以下代码所示。

```cpp theme={null}
typedef enum GameInputFeedbackEffectState    
{  
    GameInputFeedbackStopped = 0,  
    GameInputFeedbackRunning = 1,  
    GameInputFeedbackPaused = 2  
} GameInputFeedbackEffectState  
```

创建力反馈效果后，其状态为 `Stopped`。如果将新创建或已停止的反馈效果设置为 `Running` 状态，则会从效果的起始处开始播放。将状态设置为 `Paused` 会使力反馈效果停止影响电机。但是，将 `Paused` 状态的效果设置为 `Running` 时，力反馈效果会从上次暂停处继续应用效果模式。

停止效果会结束该效果，但你可以稍后再次触发。例如，当用户在赛车游戏中离开崎岖地形时。同理，暂停效果适用于游戏未变化但用户想要浏览 UI（例如暂停菜单）的场景。

调用 [IGameInputForceFeedbackEffect::SetState](/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/methods/igameinputforcefeedbackeffect_setstate) 设置力反馈效果的状态。

### 更新力反馈效果

如果新的 [GameInputForceFeedbackParams](/reference/input/gameinput/structs/gameinputforcefeedbackparams) 结构体使用相同的 [GameInputForceFeedbackEffectKind](/reference/input/gameinput/enums/gameinputforcefeedbackeffectkind) 枚举值，则可调整力反馈效果的增益或提供一组新参数。

#### 增益

通过 [IGameInputForceFeedbackEffect::SetGain](/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/methods/igameinputforcefeedbackeffect_setgain) 函数调整增益即可改变力反馈效果的强度，如以下代码所示。

```cpp theme={null}
void SetGain(  
         float gain  
)  
```

增益的取值范围为 0 到 1。默认情况下，力反馈效果的增益为 1。此函数主要用于减弱效果的强度。

#### 设置新参数

使用 [IGameInputForceFeedbackEffect::SetParams](/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/methods/igameinputforcefeedbackeffect_setparams) 函数为力反馈效果提供新参数，如以下代码所示。

```cpp theme={null}
bool SetParams(  
         const GameInputForceFeedbackParams* params  
)  
```

使用此函数替换力反馈效果的参数时，请使用与所设置力反馈效果相同的 [GameInputForceFeedbackEffectKind](/reference/input/gameinput/enums/gameinputforcefeedbackeffectkind) 枚举值。新参数会立即生效，并在不停止正在运行的效果的情况下应用。请注意，如果 duration 值未改变，持续时间计时器**不会**被刷新；仅当提供不同的 duration 值，或者效果被停止并重新启动时，才会刷新。

如果正在运行的效果被停止，则会以新参数重新启动。有些游戏可以通过为 [GameInputForceFeedbackEffectKind](/reference/input/gameinput/enums/gameinputforcefeedbackeffectkind) 枚举值为 `GameInputForceFeedbackConstant` 的反馈效果设置参数，来更改参数以模拟不同的反馈模式。

#### GIP 与 HID 设备的能力差异

在主机上，所有设备都使用 GIP 驱动模型。在 PC 上，设备可以使用 GIP 或 HID 驱动模型；安装厂商驱动通常会将其切换到 HID 模式（除非存在用于手动控制的物理开关）。HID 设备的力反馈能力受最初设计所依据的 DirectInput API 所限。GameInput 会尽力绕过这些限制，但仍存在一些差异。

无论硬件支持哪些额外的轴，HID 设备目前将力反馈限制在 AngularX 轴。此配置对绝大多数赛车方向盘都能提供良好支持。

HID 力反馈目前在 Windows 19H2+ 版本中可用，将在未来更新中支持 19H1。

## 参考 API 文档

* [GameInput（API 目录）](/reference/input/gameinput/gameinput_members)
  * 结构体
    * [GameInputDeviceInfo](/reference/input/gameinput/structs/gameinputdeviceinfo)
    * [GameInputForceFeedbackMotorInfo](/reference/input/gameinput/structs/gameinputforcefeedbackmotorinfo)
    * [GameInputForceFeedbackParams](/reference/input/gameinput/structs/gameinputforcefeedbackparams)
    * [GameInputForceFeedbackConditionParams](/reference/input/gameinput/structs/gameinputforcefeedbackconditionparams)

## 另请参阅

[IGameInputForceFeedbackEffect](/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/igameinputforcefeedbackeffect)

[IGameInputDevice](/reference/input/gameinput/interfaces/igameinputdevice/igameinputdevice)


## Related topics

- [GameInput 力反馈接口](/zh-CN/build/core-features/common/input/hardware/input-hardware-force-feedback.md)
- [GameInput 高级主题：力反馈与回调](/zh-CN/build/core-features/common/input/advanced/index.md)
- [GameInput 硬件：力反馈、触觉与传感器](/zh-CN/build/core-features/common/input/hardware/index.md)
- [GameInput 中的触觉反馈](/zh-CN/build/core-features/common/input/hardware/input-hardware-haptics.md)
- [CreateForceFeedbackEffect](/zh-CN/reference/input/gameinput/interfaces/igameinputdevice/methods/igameinputdevice_createforcefeedbackeffect.md)
