Skip to main content
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 e IGameInputForceFeedbackEffect.

Verificar se há um motor de force feedback

Para criar um efeito de force feedback, você precisa da interface 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. Isso pode ser feito chamando IGameInputDevice::GetDeviceInfo. Se houver um motor de force feedback no dispositivo de entrada, o membro ForceFeedbackMotorCount de GameInputDeviceInfo terá um valor igual ou maior que um.

Criando um efeito de force feedback

Se o struct 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, conforme mostrado no código a seguir.
O parâmetro de índice do motor é o índice do motor afetado pelo force feedback. Esse índice corresponde ao motor apropriado na matriz GameInputForceFeedbackMotorInfo do struct 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 para o efeito de force feedback que descreve as características do efeito, conforme mostrado no código a seguir.
Escolha um enum GameInputForceFeedbackEffectKind e, em seguida, inicialize o struct GameInputForceFeedbackParams correspondente. Por exemplo, para criar um efeito de feedback com o comportamento de mola, GameInputForceFeedbackParams consiste no valor GameInputForceFeedbackSpring de GameInputForceFeedbackEffectKind e no struct GameInputForceFeedbackConditionParams para uma mola. Preencha os parâmetros para o enum GameInputForceFeedbackEffectKind escolhido. Depois de selecionar o efeito do motor de force feedback pelo índice e criar o struct GameInputForceFeedbackParams, chame IGameInputDevice::CreateForceFeedbackEffect para criar o efeito. Ele é representado por uma interface IGameInputForceFeedbackEffect. O tempo de vida do efeito de force feedback está associado à interface 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 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 para definir o estado 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, conforme mostrado no código a seguir.
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.

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 compartilhar o mesmo enum GameInputForceFeedbackEffectKind.

Ganho

Altere a intensidade de um efeito de force feedback ajustando seu ganho com a função IGameInputForceFeedbackEffect::SetGain, conforme mostrado no código a seguir.
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, conforme mostrado no código a seguir.
Ao usar essa função para substituir os parâmetros de um efeito de force feedback, use o mesmo enum 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 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

Confira também

IGameInputForceFeedbackEffect IGameInputDevice
Last modified on October 6, 2026