> ## 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](/zh-TW/reference/input/gameinput/interfaces/igameinputdevice/igameinputdevice) 和 [IGameInputForceFeedbackEffect](/zh-TW/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/igameinputforcefeedbackeffect)。

## 檢查力回饋馬達

若要建立力回饋效果，您需要代表要套用效果之輸入裝置的 [IGameInputDevice](/zh-TW/reference/input/gameinput/interfaces/igameinputdevice/igameinputdevice) 介面。取得 `IGameInputDevice` 介面之後，請檢查 [GameInputDeviceInfo](/zh-TW/reference/input/gameinput/structs/gameinputdeviceinfo) 結構，以確認裝置上的力回饋馬達數目。這可以透過呼叫 [IGameInputDevice::GetDeviceInfo](/zh-TW/reference/input/gameinput/interfaces/igameinputdevice/methods/igameinputdevice_getdeviceinfo) 來完成。如果輸入裝置中有力回饋馬達，[GameInputDeviceInfo](/zh-TW/reference/input/gameinput/structs/gameinputdeviceinfo) 成員 `ForceFeedbackMotorCount` 的值會是 1 或更大。

## 建立力回饋效果

如果裝置的 [GameInputDeviceInfo](/zh-TW/reference/input/gameinput/structs/gameinputdeviceinfo) 結構指出它有一或多個力回饋馬達，請如下列程式碼所示，呼叫 [IGameInputDevice::CreateForceFeedbackEffect](/zh-TW/reference/input/gameinput/interfaces/igameinputdevice/methods/igameinputdevice_createforcefeedbackeffect) 為裝置建立力回饋效果。

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

馬達索引參數是受力回饋影響之馬達的索引。此索引對應至 [GameInputDeviceInfo](/zh-TW/reference/input/gameinput/structs/gameinputdeviceinfo) 結構之 [GameInputForceFeedbackMotorInfo](/zh-TW/reference/input/gameinput/structs/gameinputforcefeedbackmotorinfo) 陣列中的適當馬達。此陣列包含現有力回饋馬達及其功能的相關資訊。

對於第二個參數，請如下列程式碼所示，為力回饋效果建置描述效果特性的 [GameInputForceFeedbackParams](/zh-TW/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](/zh-TW/reference/input/gameinput/enums/gameinputforcefeedbackeffectkind) 列舉，然後初始化對應的 `GameInputForceFeedbackParams` 結構。

例如，若要建立具有彈簧行為的回饋效果，[GameInputForceFeedbackParams](/zh-TW/reference/input/gameinput/structs/gameinputforcefeedbackparams) 由 [GameInputForceFeedbackEffectKind](/zh-TW/reference/input/gameinput/enums/gameinputforcefeedbackeffectkind) 值 `GameInputForceFeedbackSpring` 和彈簧的 [GameInputForceFeedbackConditionParams](/zh-TW/reference/input/gameinput/structs/gameinputforcefeedbackconditionparams) 結構組成。請填入您所選 [GameInputForceFeedbackEffectKind](/zh-TW/reference/input/gameinput/enums/gameinputforcefeedbackeffectkind) 列舉的參數。

依索引選取力回饋馬達效果並建立 [GameInputForceFeedbackParams](/zh-TW/reference/input/gameinput/structs/gameinputforcefeedbackparams) 結構之後，呼叫 [IGameInputDevice::CreateForceFeedbackEffect](/zh-TW/reference/input/gameinput/interfaces/igameinputdevice/methods/igameinputdevice_createforcefeedbackeffect) 以建立效果。此效果由 [IGameInputForceFeedbackEffect](/zh-TW/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/igameinputforcefeedbackeffect) 介面表示。

力回饋效果的存留期與所建立的 [IGameInputForceFeedbackEffect](/zh-TW/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/igameinputforcefeedbackeffect) 介面相關聯。建立效果時，會將其載入至裝置。釋放最後一個參考時，力回饋效果會停止，並從裝置馬達卸載。

## 套用及更新力回饋效果

建立力回饋效果時，會直接將其載入至裝置馬達。力回饋馬達的記憶體有限，這會限制可同時載入和播放的力回饋效果數目。達到此限制後呼叫 [IGameInputDevice::CreateForceFeedbackEffect](/zh-TW/reference/input/gameinput/interfaces/igameinputdevice/methods/igameinputdevice_createforcefeedbackeffect)，會導致函式傳回錯誤。

建立力回饋效果之後，它會以停止狀態載入至力回饋馬達。載入之後，請使用 [IGameInputForceFeedbackEffect](/zh-TW/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/igameinputforcefeedbackeffect) 介面將效果[設定狀態](/zh-TW/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/methods/igameinputforcefeedbackeffect_setstate)為 `Running`。這會在裝置馬達上播放效果。

### 力回饋效果的狀態

力回饋效果會經過數個狀態，以符合遊戲的目前狀態。請務必依照遊戲更新並留意效果的狀態，以維持預期的行為。

力回饋的狀態可以依據 [GameInputFeedbackEffectState](/zh-TW/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](/zh-TW/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/methods/igameinputforcefeedbackeffect_setstate) 以設定力回饋效果的狀態。

### 更新力回饋效果

如果新的 [GameInputForceFeedbackParams](/zh-TW/reference/input/gameinput/structs/gameinputforcefeedbackparams) 結構共用相同的 [GameInputForceFeedbackEffectKind](/zh-TW/reference/input/gameinput/enums/gameinputforcefeedbackeffectkind) 列舉，您可以調整力回饋效果的增益，或提供一組新的參數。

#### 增益

如下列程式碼所示，使用 [IGameInputForceFeedbackEffect::SetGain](/zh-TW/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/methods/igameinputforcefeedbackeffect_setgain) 函式調整增益，以變更力回饋效果的強度。

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

增益可以是介於 0 到 1 之間的值。根據預設，力回饋效果的增益設定為 1。此函式主要用於減弱效果的強度。

#### 設定新參數

如下列程式碼所示，使用 [IGameInputForceFeedbackEffect::SetParams](/zh-TW/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/methods/igameinputforcefeedbackeffect_setparams) 函式為力回饋效果提供新參數。

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

使用此函式取代力回饋效果的參數時，請使用與您要設定參數之力回饋效果相同的 [GameInputForceFeedbackEffectKind](/zh-TW/reference/input/gameinput/enums/gameinputforcefeedbackeffectkind) 列舉。新參數會立即生效，並在不停止執行中效果的情況下套用。請注意，如果持續時間值沒有變更，持續時間計時器**不會**重新整理。只有在提供不同的持續時間值，或停止並重新啟動效果時，才會重新整理。

如果執行中的效果已停止，則會以新參數重新啟動。部分遊戲可以藉由為 [GameInputForceFeedbackEffectKind](/zh-TW/reference/input/gameinput/enums/gameinputforcefeedbackeffectkind) 列舉為 `GameInputForceFeedbackConstant` 的回饋效果設定參數，來變更參數以模擬不同的回饋模式。

#### GIP 與 HID 裝置之間的功能差異

在主機上，所有裝置都使用 GIP 驅動程式模型。在 PC 上，裝置可以使用 GIP 或 HID 驅動程式模型；安裝廠商驅動程式通常會將其轉換為 HID 模式 (除非有可手動控制的實體開關)。HID 裝置的力回饋功能受限於其原先設計所依據的 DirectInput API。GameInput 會盡可能設法因應這些限制。儘管如此，仍存在一些差異。

HID 裝置目前將力回饋限制在 AngularX 軸，無論硬體支援哪些其他軸。此設定可為絕大多數賽車方向盤提供良好的支援。

HID 力回饋目前可在 19H2 以上版本的 Windows 中使用，並將在未來的更新中更新為可在 19H1 中運作。

## 參考 API 文件

* [GameInput (API 內容)](/zh-TW/reference/input/gameinput/gameinput_members)
  * 結構
    * [GameInputDeviceInfo](/zh-TW/reference/input/gameinput/structs/gameinputdeviceinfo)
    * [GameInputForceFeedbackMotorInfo](/zh-TW/reference/input/gameinput/structs/gameinputforcefeedbackmotorinfo)
    * [GameInputForceFeedbackParams](/zh-TW/reference/input/gameinput/structs/gameinputforcefeedbackparams)
    * [GameInputForceFeedbackConditionParams](/zh-TW/reference/input/gameinput/structs/gameinputforcefeedbackconditionparams)

## 另請參閱

[IGameInputForceFeedbackEffect](/zh-TW/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/igameinputforcefeedbackeffect)

[IGameInputDevice](/zh-TW/reference/input/gameinput/interfaces/igameinputdevice/igameinputdevice)


## Related topics

- [GameInput 上的力反馈](/zh-CN/build/core-features/common/input/advanced/input-forcefeedback.md)
- [GameInput 力反馈接口](/zh-CN/build/core-features/common/input/hardware/input-hardware-force-feedback.md)
- [GameInput](/zh-CN/reference/input/gameinput/gameinput_members.md)
- [CreateForceFeedbackEffect](/zh-CN/reference/input/gameinput/interfaces/igameinputdevice/methods/igameinputdevice_createforcefeedbackeffect.md)
- [GameInput 高级主题：力反馈与回调](/zh-CN/build/core-features/common/input/advanced/index.md)
