> ## 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 en GameInput

> Force feedback en GameInput

Use este tema para comprender cómo el force feedback en `GameInput` puede administrar la salida del dispositivo. Con el force feedback, los dispositivos de entrada de juego pueden mover físicamente uno o varios de los controles de entrada del dispositivo para proporcionar retroalimentación táctil al usuario. El force feedback funciona con dispositivos de entrada que simulan el manejo de vehículos, como volantes de conducción y equipos de simulación de vuelo. Estos dispositivos contienen un motor de force feedback que aplica fuerza al control sobre un eje. En un volante de carreras, es una fuerza rotacional que gira el volante para simular una situación del juego. Use el force feedback con una palanca de vuelo para hacer que las palancas sean difíciles de empujar o tirar desde una posición determinada.

Para obtener más información sobre las interfaces de `GameInput` que admiten force feedback, consulte [IGameInputDevice](/reference/input/gameinput/interfaces/igameinputdevice/igameinputdevice) e [IGameInputForceFeedbackEffect](/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/igameinputforcefeedbackeffect).

## Comprobar la existencia de un motor de force feedback

Para crear un efecto de force feedback, necesita la interfaz [IGameInputDevice](/reference/input/gameinput/interfaces/igameinputdevice/igameinputdevice) que representa el dispositivo de entrada al que desea aplicar el efecto. Después de adquirir la interfaz `IGameInputDevice`, compruebe el número de motores de force feedback del dispositivo examinando la estructura [GameInputDeviceInfo](/reference/input/gameinput/structs/gameinputdeviceinfo). Esto se puede hacer llamando a [IGameInputDevice::GetDeviceInfo](/reference/input/gameinput/interfaces/igameinputdevice/methods/igameinputdevice_getdeviceinfo). Si hay un motor de force feedback en el dispositivo de entrada, el miembro `ForceFeedbackMotorCount` de [GameInputDeviceInfo](/reference/input/gameinput/structs/gameinputdeviceinfo) tiene un valor de uno o superior.

## Creación de un efecto de force feedback

Si la estructura [GameInputDeviceInfo](/reference/input/gameinput/structs/gameinputdeviceinfo) de un dispositivo indica que tiene uno o varios motores de force feedback, cree un efecto de force feedback para el dispositivo llamando a [IGameInputDevice::CreateForceFeedbackEffect](/reference/input/gameinput/interfaces/igameinputdevice/methods/igameinputdevice_createforcefeedbackeffect), como se muestra en el código siguiente.

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

El parámetro de índice de motor es el índice del motor afectado por el force feedback. Este índice corresponde al motor adecuado en la matriz [GameInputForceFeedbackMotorInfo](/reference/input/gameinput/structs/gameinputforcefeedbackmotorinfo) de la estructura [GameInputDeviceInfo](/reference/input/gameinput/structs/gameinputdeviceinfo). Esta matriz incluye información sobre los motores de force feedback presentes y sus capacidades.

Para el segundo parámetro, cree la estructura [GameInputForceFeedbackParams](/reference/input/gameinput/structs/gameinputforcefeedbackparams) del efecto de force feedback que describe las características del efecto, como se muestra en el código siguiente.

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

Elija una enumeración [GameInputForceFeedbackEffectKind](/reference/input/gameinput/enums/gameinputforcefeedbackeffectkind) y, a continuación, inicialice la estructura `GameInputForceFeedbackParams` correspondiente.

Por ejemplo, para crear un efecto de feedback con el comportamiento de resorte, [GameInputForceFeedbackParams](/reference/input/gameinput/structs/gameinputforcefeedbackparams) consta del valor `GameInputForceFeedbackSpring` de [GameInputForceFeedbackEffectKind](/reference/input/gameinput/enums/gameinputforcefeedbackeffectkind) y la estructura [GameInputForceFeedbackConditionParams](/reference/input/gameinput/structs/gameinputforcefeedbackconditionparams) para un resorte. Rellene los parámetros de la enumeración [GameInputForceFeedbackEffectKind](/reference/input/gameinput/enums/gameinputforcefeedbackeffectkind) elegida.

Después de seleccionar el efecto del motor de force feedback por su índice y de crear la estructura [GameInputForceFeedbackParams](/reference/input/gameinput/structs/gameinputforcefeedbackparams), llame a [IGameInputDevice::CreateForceFeedbackEffect](/reference/input/gameinput/interfaces/igameinputdevice/methods/igameinputdevice_createforcefeedbackeffect) para crear el efecto. Está representado por una interfaz [IGameInputForceFeedbackEffect](/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/igameinputforcefeedbackeffect).

La duración del efecto de force feedback está asociada a la interfaz [IGameInputForceFeedbackEffect](/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/igameinputforcefeedbackeffect) creada. Cuando se crea el efecto, se carga en el dispositivo. Cuando se libera la última referencia, el efecto de force feedback se detiene y se descarga del motor del dispositivo.

## Aplicación y actualización de efectos de force feedback

Cuando se crea un efecto de force feedback, se carga directamente en el motor del dispositivo. Un motor de force feedback tiene una cantidad finita de memoria. Esto limita el número de efectos de force feedback que se cargan y reproducen al mismo tiempo. Llamar a [IGameInputDevice::CreateForceFeedbackEffect](/reference/input/gameinput/interfaces/igameinputdevice/methods/igameinputdevice_createforcefeedbackeffect) después de alcanzar este límite hace que la función devuelva un error.

Después de crear un efecto de force feedback, se carga en el motor de force feedback en estado detenido. Una vez cargado, use la interfaz [IGameInputForceFeedbackEffect](/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/igameinputforcefeedbackeffect) para [establecer el estado](/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/methods/igameinputforcefeedbackeffect_setstate) del efecto en `Running`. Esto reproduce el efecto en el motor del dispositivo.

### Estados del efecto de force feedback

Un efecto de force feedback pasa por varios estados para adaptarse al estado actual del juego. Es importante actualizar y tener en cuenta el estado de un efecto de acuerdo con el juego para mantener el comportamiento esperado.

Los estados del force feedback se pueden establecer según [GameInputFeedbackEffectState](/reference/input/gameinput/enums/gameinputfeedbackeffectstate), como se muestra en el código siguiente.

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

Después de crear el efecto de force feedback, este cambia al estado `Stopped`. Si un efecto de feedback nuevo o detenido se establece en el estado `Running`, se reproduce desde el principio del efecto. Establecer el estado en `Paused` hace que el efecto de force feedback deje de afectar al motor. Sin embargo, establecer un efecto en estado `Paused` en `Running` hace que el efecto de force feedback aplique el patrón del efecto donde lo dejó.

Detener un efecto lo finaliza, pero puede desencadenarlo de nuevo más adelante. Por ejemplo, cuando un usuario abandona un terreno accidentado en un juego de carreras. Del mismo modo, pausar un efecto es útil en situaciones en las que el juego no cambia pero el usuario desea navegar por la interfaz de usuario, como un menú de pausa.

Establezca el estado de un efecto de force feedback llamando a [IGameInputForceFeedbackEffect::SetState](/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/methods/igameinputforcefeedbackeffect_setstate).

### Actualización de un efecto de force feedback

Ajuste la ganancia de un efecto de force feedback o proporcione un nuevo conjunto de parámetros si la nueva estructura [GameInputForceFeedbackParams](/reference/input/gameinput/structs/gameinputforcefeedbackparams) comparte la misma enumeración [GameInputForceFeedbackEffectKind](/reference/input/gameinput/enums/gameinputforcefeedbackeffectkind).

#### Ganancia

Cambie la intensidad de un efecto de force feedback ajustando su ganancia con la función [IGameInputForceFeedbackEffect::SetGain](/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/methods/igameinputforcefeedbackeffect_setgain), como se muestra en el código siguiente.

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

La ganancia puede ser un valor entre 0 y 1. De forma predeterminada, la ganancia de un efecto de force feedback está establecida en 1. Esta función se usa principalmente para suavizar la intensidad de un efecto.

#### Establecimiento de nuevos parámetros

Proporcione nuevos parámetros para un efecto de force feedback mediante la función [IGameInputForceFeedbackEffect::SetParams](/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/methods/igameinputforcefeedbackeffect_setparams), como se muestra en el código siguiente.

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

Al usar esta función para reemplazar los parámetros de un efecto de force feedback, use la misma enumeración [GameInputForceFeedbackEffectKind](/reference/input/gameinput/enums/gameinputforcefeedbackeffectkind) que el efecto de force feedback para el que está estableciendo los parámetros. Los nuevos parámetros surten efecto de inmediato y se aplican sin detener el efecto en ejecución. Tenga en cuenta que el temporizador de duración **no** se actualiza si el valor de duración no cambia. Solo se actualizará si se proporciona un valor de duración diferente, o si el efecto se detiene y se reinicia.

Si el efecto en ejecución está detenido, se reinicia con los nuevos parámetros. Algunos juegos pueden cambiar los parámetros para simular diferentes patrones de retroalimentación estableciendo los parámetros de un efecto de feedback con una enumeración [GameInputForceFeedbackEffectKind](/reference/input/gameinput/enums/gameinputforcefeedbackeffectkind) de `GameInputForceFeedbackConstant`.

#### Diferencias de capacidades entre dispositivos GIP y HID

En la consola, todos los dispositivos usan el modelo de controlador GIP. En PC, los dispositivos pueden usar el modelo de controlador GIP o HID; la instalación de controladores del proveedor generalmente los convierte al modo HID (a menos que haya un conmutador físico para el control manual). Las capacidades de force feedback de los dispositivos HID están limitadas por la API DirectInput para la que se diseñaron originalmente. GameInput hace todo lo posible para sortear estas limitaciones cuando es posible. No obstante, persisten algunas diferencias.

Los dispositivos HID actualmente restringen el force feedback al eje AngularX, independientemente de los ejes adicionales que admita el hardware. Esta configuración proporciona una buena compatibilidad para la gran mayoría de los volantes de carreras.

El force feedback HID está disponible actualmente en las versiones 19H2+ de Windows y se actualizará para funcionar en 19H1 en una actualización futura.

## Documentación de referencia de la API

* [GameInput (contenido de la API)](/reference/input/gameinput/gameinput_members)
  * Estructuras
    * [GameInputDeviceInfo](/reference/input/gameinput/structs/gameinputdeviceinfo)
    * [GameInputForceFeedbackMotorInfo](/reference/input/gameinput/structs/gameinputforcefeedbackmotorinfo)
    * [GameInputForceFeedbackParams](/reference/input/gameinput/structs/gameinputforcefeedbackparams)
    * [GameInputForceFeedbackConditionParams](/reference/input/gameinput/structs/gameinputforcefeedbackconditionparams)

## Consulte también

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

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


## Related topics

- [Temas avanzados de GameInput: force feedback y devoluciones de llamada](/es/build/core-features/common/input/advanced/index.md)
- [IGameInputForceFeedbackEffect::SetParams](/es/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/methods/igameinputforcefeedbackeffect_setparams.md)
- [IGameInputForceFeedbackEffect::SetGain](/es/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/methods/igameinputforcefeedbackeffect_setgain.md)
- [IGameInputForceFeedbackEffect::GetState](/es/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/methods/igameinputforcefeedbackeffect_getstate.md)
- [GameInputForceFeedbackEffectKind](/es/reference/input/gameinput/enums/gameinputforcefeedbackeffectkind.md)
