GameInput 上的力回馈

使用本主题了解强制使用反馈 GameInput 管理设备输出。 借助强制反馈,游戏输入设备可以实际移动一个或多个设备的输入控件,以便向用户提供反馈。 强制反馈适用于模拟汽车运算的输入设备,如驾驶滚轮和飞行模拟机。 这些设备包含一个力反馈马达,通过轴向控制器施加力。 在赛车盘上,旋转力用于旋转滚轮模拟游戏场景。 对飞行粘滞使用强制反馈,使定位器难以从特定位置推送或提取。

有关支持强制反馈的 GameInput 界面详细信息,请参阅 IPutInputDeviceIPutInputForceedbackEffect

检查力回馈马达

若要创建强制反馈效果,需要表示 的输入设备的 IPutInputDevice 界面。 获取 IGameInputDevice 界面后,通过检查 GameInputDeviceInfo 安装的反馈数。 这可通过致电 iPutInputDevice ::GetDeviceInfo。 如果输入设备中强制反馈运动,则 GameInputDeviceInfo 成员 ForceFeedbackMotorCount 值为 1 或更高。

创建力回馈效果

如果设备的 GameInputDeviceInfo 指示其具有一个或多个强制反馈源,请通过呼叫 IPutInputDevice::CreateForceFeedbackEffect ,如下代码所示。

HRESULT CreateForceFeedbackEffect(  
         uint32_t motorIndex,  
         const GameInputForceFeedbackParams* params,  
         IGameInputForceFeedbackEffect** effect  
) 

运动索引参数是受强制反馈影响的运动索引。 此索引将是对应于 GameInputDeviceInfo 结构的 GameInputForceFeedbackMotorInfo 数组中相应马达的索引。 此数组包含有关当前强制反馈组及其功能的信息。

对于第二个参数,构建 GameInputForceFeedbackParams 一个强制反馈效果,描述效果的特征,如下代码所示。

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;  
    };  
} 

选择 GameInputForceEdbackEffectKind 一个数字,然后初始化 GameInputForceFeedbackParams 字符串。

例如,若要通过今感创建反馈效果,GameInputForceedbackParams 包含弹跳动作的 GameInputForceFeedbackEffectKindGameInputForceFeedbackSpringGameInputForceedbackConditionParams。 填写所选项目参数 GameInputForceFeedbackEffectKind 数字。

按索引选择强制反馈运动效果并创建 GameInputForceEdbackParams 之后,请致电 IPutInputDevice::CreateForceFeedbackEffect 以创建效果。 它由 IPutInputForceedbackEffect 界面表示。

力回馈效果的生命周期将关联到创建的 IGameInputForceFeedbackEffect。 创建效果后,会向设备加载效果。 当最后一个引用发布时,从设备运动中停止并卸载强制反馈效果。

应用和更新力回馈效果

创建强制反馈效果后,其将直接加载到设备运动中。 力回馈马达的内存有限。 这将限制同时加载和播放的强制反馈效果的数量。 在达到此限制后,调用 IGameInputDevice::CreateForceFeedbackEffect 会导致该函数返回错误。

创建强制反馈效果后,其加载为在已停止状态中的强制反馈运动。 加载后,可使用 IGameInputForceFeedbackEffect 界面将效果的状态设置Running。 这将播放设备运动的影响。

力回馈效果的状态

根据游戏的当前状态,强制反馈效果在多个状态中移动。 为了保持预期行为,请根据结果更新并注意效果的状态,这一点很重要。

根据 GameInputFeedbackEffectState 设置强制反馈 状态,如下代码所示。

typedef enum GameInputFeedbackEffectState    
{  
    GameInputFeedbackStopped = 0,  
    GameInputFeedbackRunning = 1,  
    GameInputFeedbackPaused = 2  
} GameInputFeedbackEffectState  

创建强制反馈效果后,它 Stopped 状态。 如果将新的或停止的反馈效果设置为 Running ,它会从效果的开头开始播放。 将状态设置为 Paused 导致强制反馈效果停止对运动的影响。 但是,为 Paused 状态效果 Running 强制反馈效果会应用留下的效果模式。

停止效果会结束效果,但可以在以后再次触发该效果。 例如,在赛车中,用户离开时。 同样,在规则播放保持不变但用户希望导航 UI 时(例如暂停菜单)时,暂停效果也很有用。

可通过调用 IGameInputForceFeedbackEffect::SetState 来设置力回馈效果的状态。

更新力回馈效果

如果新 GameInputForceFeedbackParams struct 共享了相同 GameInputForceFeedbackEffectKind 数字,请调整强制反馈效果的获得或提供一组新参数。

增益

可通过使用 IGameInputForceFeedbackEffect::SetGain 函数调整力回馈效果的增益来更改力回馈效果的强度,如下代码所示。

void SetGain(  
         float gain  
)  

增益的值可介于 0 和 1 之间。 默认情况下,强制反馈效果的得数设置为 1。 此函数主要用于缓解效果的 <3> <3> <2>发性。

设置新参数

可以使用 IGameInputForceFeedbackEffect::SetParams 函数为力回馈效果提供新参数,如下代码所示。

bool SetParams(  
         const GameInputForceFeedbackParams* params  
)  

使用此函数替换强制反馈效果的参数时,请使用与设置参数时相同的 GameInputForceFeedbackEffectKind 数字作为强制反馈效果。 新参数会立即应用,并且不会停止运行效果。 请注意,如果持续时间值未更改,则不会刷新持续时间计时器。 仅当提供了不同的持续时间值,或停止并重新启动效果时,才会刷新它。

如果停止运行效果,将用新参数重启。 一些游戏可能会更改参数,通过使用 GameInputForceFeedbackEffectKind 数字来设置反馈效果的参数 GameInputForceFeedbackConstant

GIP 和 HID 设备之间的功能差异

在主机上,所有设备都使用 GIP 驱动程序模型。 在电脑上,设备可以使用 GIP 或 HID 驱动程序模型;安装供应商驱动程序通常会将它们转换为 HID 模式(除非有用于手动控制的物理开关)。 HID 设备的力反馈功能受限于最初设计它们时所针对的 DirectInput API。 GameInput 尽可能努力地解决这些限制。 尽管如此,仍然存在一些差异。

HID 设备当前将力反馈限制到 AngularX 轴,而不考虑硬件支持的其他轴。 此配置为绝大多数赛车方向盘提供了良好支持。

HID 强制反馈当前在 19H2+ 版本的 Windows 中提供,并将在将来的更新中更新为在 19H1 中工作。

另请参阅

IGameInputForceFeedbackEffect

IGameInputDevice