> ## 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.

# Force feedback no GameInput

> Force feedback no GameInput

Use este tópico para entender como o force feedback no `GameInput` pode gerenciar a saída do dispositivo. Com o force feedback, os dispositivos de entrada de jogos podem mover fisicamente um ou mais controles de entrada do dispositivo para fornecer resposta tátil ao usuário. O force feedback funciona com dispositivos de entrada que simulam a operação de veículos, como volantes e equipamentos de simulação de voo. Esses dispositivos contêm um motor de force feedback que aplica força ao controle sobre um eixo. Em um volante de corrida, é uma força rotacional que gira o volante para simular um cenário do jogo. Use o force feedback com um manche de voo para tornar as alavancas difíceis de empurrar ou puxar a partir de uma determinada posição.

Para obter mais informações sobre as interfaces do `GameInput` que oferecem suporte a force feedback, consulte [IGameInputDevice](/pt-BR/reference/input/gameinput/interfaces/igameinputdevice/igameinputdevice) e [IGameInputForceFeedbackEffect](/pt-BR/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/igameinputforcefeedbackeffect).

## Verificar se há um motor de force feedback

Para criar um efeito de force feedback, você precisa da interface [IGameInputDevice](/pt-BR/reference/input/gameinput/interfaces/igameinputdevice/igameinputdevice) que representa o dispositivo de entrada ao qual você deseja aplicar o efeito. Depois de adquirir a interface `IGameInputDevice`, verifique o número de motores de force feedback no dispositivo examinando o struct [GameInputDeviceInfo](/pt-BR/reference/input/gameinput/structs/gameinputdeviceinfo). Isso pode ser feito chamando [IGameInputDevice::GetDeviceInfo](/pt-BR/reference/input/gameinput/interfaces/igameinputdevice/methods/igameinputdevice_getdeviceinfo). Se houver um motor de force feedback no dispositivo de entrada, o membro `ForceFeedbackMotorCount` de [GameInputDeviceInfo](/pt-BR/reference/input/gameinput/structs/gameinputdeviceinfo) terá um valor igual ou maior que um.

## Criando um efeito de force feedback

Se o struct [GameInputDeviceInfo](/pt-BR/reference/input/gameinput/structs/gameinputdeviceinfo) de um dispositivo indicar que ele tem um ou mais motores de force feedback, crie um efeito de force feedback para o dispositivo chamando [IGameInputDevice::CreateForceFeedbackEffect](/pt-BR/reference/input/gameinput/interfaces/igameinputdevice/methods/igameinputdevice_createforcefeedbackeffect), conforme mostrado no código a seguir.

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

O parâmetro de índice do motor é o índice do motor afetado pelo force feedback. Esse índice corresponde ao motor apropriado na matriz [GameInputForceFeedbackMotorInfo](/pt-BR/reference/input/gameinput/structs/gameinputforcefeedbackmotorinfo) do struct [GameInputDeviceInfo](/pt-BR/reference/input/gameinput/structs/gameinputdeviceinfo). Essa matriz inclui informações sobre os motores de force feedback presentes e seus recursos.

Para o segundo parâmetro, crie o struct [GameInputForceFeedbackParams](/pt-BR/reference/input/gameinput/structs/gameinputforcefeedbackparams) para o efeito de force feedback que descreve as características do efeito, conforme mostrado no código a seguir.

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

Escolha um enum [GameInputForceFeedbackEffectKind](/pt-BR/reference/input/gameinput/enums/gameinputforcefeedbackeffectkind) e, em seguida, inicialize o struct `GameInputForceFeedbackParams` correspondente.

Por exemplo, para criar um efeito de feedback com o comportamento de mola, [GameInputForceFeedbackParams](/pt-BR/reference/input/gameinput/structs/gameinputforcefeedbackparams) consiste no valor `GameInputForceFeedbackSpring` de [GameInputForceFeedbackEffectKind](/pt-BR/reference/input/gameinput/enums/gameinputforcefeedbackeffectkind) e no struct [GameInputForceFeedbackConditionParams](/pt-BR/reference/input/gameinput/structs/gameinputforcefeedbackconditionparams) para uma mola. Preencha os parâmetros para o enum [GameInputForceFeedbackEffectKind](/pt-BR/reference/input/gameinput/enums/gameinputforcefeedbackeffectkind) escolhido.

Depois de selecionar o efeito do motor de force feedback pelo índice e criar o struct [GameInputForceFeedbackParams](/pt-BR/reference/input/gameinput/structs/gameinputforcefeedbackparams), chame [IGameInputDevice::CreateForceFeedbackEffect](/pt-BR/reference/input/gameinput/interfaces/igameinputdevice/methods/igameinputdevice_createforcefeedbackeffect) para criar o efeito. Ele é representado por uma interface [IGameInputForceFeedbackEffect](/pt-BR/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/igameinputforcefeedbackeffect).

O tempo de vida do efeito de force feedback está associado à interface [IGameInputForceFeedbackEffect](/pt-BR/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/igameinputforcefeedbackeffect) criada. Quando o efeito é criado, ele é carregado no dispositivo. Quando a última referência é liberada, o efeito de force feedback é interrompido e descarregado do motor do dispositivo.

## Aplicando e atualizando efeitos de force feedback

Quando um efeito de force feedback é criado, ele é carregado diretamente no motor do dispositivo. Um motor de force feedback tem uma quantidade finita de memória. Isso limita o número de efeitos de force feedback que são carregados e reproduzidos ao mesmo tempo. Chamar [IGameInputDevice::CreateForceFeedbackEffect](/pt-BR/reference/input/gameinput/interfaces/igameinputdevice/methods/igameinputdevice_createforcefeedbackeffect) depois de atingir esse limite faz com que a função retorne um erro.

Depois de criado, o efeito de force feedback é carregado no motor de force feedback em um estado parado. Depois de carregado, use a interface [IGameInputForceFeedbackEffect](/pt-BR/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/igameinputforcefeedbackeffect) para [definir o estado](/pt-BR/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/methods/igameinputforcefeedbackeffect_setstate) do efeito como `Running`. Isso reproduz o efeito no motor do dispositivo.

### Estados do efeito de force feedback

Um efeito de force feedback passa por vários estados para corresponder ao estado atual do jogo. É importante que você atualize e observe o estado de um efeito de acordo com seu jogo para manter o comportamento esperado.

Os estados do force feedback podem ser definidos de acordo com [GameInputFeedbackEffectState](/pt-BR/reference/input/gameinput/enums/gameinputfeedbackeffectstate), conforme mostrado no código a seguir.

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

Depois que o efeito de force feedback é criado, ele muda para o estado `Stopped`. Se um efeito de feedback novo ou parado for definido para o estado `Running`, ele será reproduzido desde o início do efeito. Definir o estado como `Paused` faz com que o efeito de force feedback pare de afetar o motor. No entanto, definir um efeito em estado `Paused` como `Running` faz com que o efeito de force feedback aplique o padrão do efeito a partir de onde parou.

Interromper um efeito encerra o efeito, mas você pode acioná-lo novamente mais tarde. Por exemplo, quando um usuário sai de um terreno acidentado em um jogo de corrida. Da mesma forma, pausar um efeito é útil em situações em que a jogabilidade não muda, mas o usuário deseja navegar pela interface do usuário, como um menu de pausa.

Defina o estado de um efeito de force feedback chamando [IGameInputForceFeedbackEffect::SetState](/pt-BR/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/methods/igameinputforcefeedbackeffect_setstate).

### Atualizando um efeito de force feedback

Ajuste o ganho de um efeito de force feedback ou forneça um novo conjunto de parâmetros se o novo struct [GameInputForceFeedbackParams](/pt-BR/reference/input/gameinput/structs/gameinputforcefeedbackparams) compartilhar o mesmo enum [GameInputForceFeedbackEffectKind](/pt-BR/reference/input/gameinput/enums/gameinputforcefeedbackeffectkind).

#### Ganho

Altere a intensidade de um efeito de force feedback ajustando seu ganho com a função [IGameInputForceFeedbackEffect::SetGain](/pt-BR/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/methods/igameinputforcefeedbackeffect_setgain), conforme mostrado no código a seguir.

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

O ganho pode ser um valor entre 0 e 1. Por padrão, o ganho de um efeito de force feedback é definido como 1. Essa função é usada principalmente para suavizar a intensidade de um efeito.

#### Definindo novos parâmetros

Forneça novos parâmetros para um efeito de force feedback usando a função [IGameInputForceFeedbackEffect::SetParams](/pt-BR/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/methods/igameinputforcefeedbackeffect_setparams), conforme mostrado no código a seguir.

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

Ao usar essa função para substituir os parâmetros de um efeito de force feedback, use o mesmo enum [GameInputForceFeedbackEffectKind](/pt-BR/reference/input/gameinput/enums/gameinputforcefeedbackeffectkind) do efeito de force feedback para o qual você está definindo parâmetros. Os novos parâmetros entram em vigor imediatamente e são aplicados sem interromper o efeito em execução. Observe que o temporizador de duração **não** é reiniciado se o valor da duração não mudar.  Ele só será reiniciado se um valor de duração diferente for fornecido ou se o efeito for interrompido e reiniciado.

Se o efeito em execução for interrompido, ele será reiniciado com os novos parâmetros. Alguns jogos podem alterar parâmetros para simular diferentes padrões de feedback definindo os parâmetros de um efeito de feedback com um enum [GameInputForceFeedbackEffectKind](/pt-BR/reference/input/gameinput/enums/gameinputforcefeedbackeffectkind) de `GameInputForceFeedbackConstant`.

#### Diferenças de recursos entre dispositivos GIP e HID

No console, todos os dispositivos usam o modelo de driver GIP. No PC, os dispositivos podem usar o modelo de driver GIP ou HID; a instalação de drivers do fornecedor geralmente os converte para o modo HID (a menos que haja um interruptor físico para controle manual). Os recursos de force feedback dos dispositivos HID são limitados pela API DirectInput para a qual eles foram originalmente projetados. O GameInput faz o possível para contornar essas limitações sempre que viável. Ainda assim, algumas diferenças permanecem.

Atualmente, os dispositivos HID restringem o force feedback ao eixo AngularX, independentemente de eixos adicionais compatíveis com o hardware. Essa configuração oferece um bom suporte para a grande maioria dos volantes de corrida.

O force feedback HID está disponível atualmente nas versões 19H2+ do Windows e será atualizado para funcionar na 19H1 em uma atualização futura.

## Documentação de referência da API

* [GameInput (conteúdo da API)](/pt-BR/reference/input/gameinput/gameinput_members)
  * Estruturas
    * [GameInputDeviceInfo](/pt-BR/reference/input/gameinput/structs/gameinputdeviceinfo)
    * [GameInputForceFeedbackMotorInfo](/pt-BR/reference/input/gameinput/structs/gameinputforcefeedbackmotorinfo)
    * [GameInputForceFeedbackParams](/pt-BR/reference/input/gameinput/structs/gameinputforcefeedbackparams)
    * [GameInputForceFeedbackConditionParams](/pt-BR/reference/input/gameinput/structs/gameinputforcefeedbackconditionparams)

## Confira também

[IGameInputForceFeedbackEffect](/pt-BR/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/igameinputforcefeedbackeffect)

[IGameInputDevice](/pt-BR/reference/input/gameinput/interfaces/igameinputdevice/igameinputdevice)


## Related topics

- [Force feedback en GameInput](/es/build/core-features/common/input/advanced/input-forcefeedback.md)
- [Force feedback on GameInput](/build/core-features/common/input/advanced/input-forcefeedback.md)
- [GameInput force feedback interface](/build/core-features/common/input/hardware/input-hardware-force-feedback.md)
- [IGameInputForceFeedbackEffect::SetParams](/es/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/methods/igameinputforcefeedbackeffect_setparams.md)
- [GameInputForceFeedbackParams](/reference/input/gameinput/structs/gameinputforcefeedbackparams.md)
