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

Comprobar la existencia de un motor de force feedback

Para crear un efecto de force feedback, necesita la interfaz 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. Esto se puede hacer llamando a IGameInputDevice::GetDeviceInfo. Si hay un motor de force feedback en el dispositivo de entrada, el miembro ForceFeedbackMotorCount de GameInputDeviceInfo tiene un valor de uno o superior.

Creación de un efecto de force feedback

Si la estructura 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, como se muestra en el código siguiente.
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 de la estructura 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 del efecto de force feedback que describe las características del efecto, como se muestra en el código siguiente.
Elija una enumeración GameInputForceFeedbackEffectKind y, a continuación, inicialice la estructura GameInputForceFeedbackParams correspondiente. Por ejemplo, para crear un efecto de feedback con el comportamiento de resorte, GameInputForceFeedbackParams consta del valor GameInputForceFeedbackSpring de GameInputForceFeedbackEffectKind y la estructura GameInputForceFeedbackConditionParams para un resorte. Rellene los parámetros de la enumeración GameInputForceFeedbackEffectKind elegida. Después de seleccionar el efecto del motor de force feedback por su índice y de crear la estructura GameInputForceFeedbackParams, llame a IGameInputDevice::CreateForceFeedbackEffect para crear el efecto. Está representado por una interfaz IGameInputForceFeedbackEffect. La duración del efecto de force feedback está asociada a la interfaz 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 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 para establecer el estado 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, como se muestra en el código siguiente.
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.

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 comparte la misma enumeración GameInputForceFeedbackEffectKind.

Ganancia

Cambie la intensidad de un efecto de force feedback ajustando su ganancia con la función IGameInputForceFeedbackEffect::SetGain, como se muestra en el código siguiente.
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, como se muestra en el código siguiente.
Al usar esta función para reemplazar los parámetros de un efecto de force feedback, use la misma enumeración 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 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

Consulte también

IGameInputForceFeedbackEffect IGameInputDevice
Última modificación el 28 de agosto de 2026