Volante y retroalimentación de fuerzaRacing wheel and force feedback

En esta página se describen los conceptos básicos de la programación de volantes de Xbox One con Windows. Gaming. Input. RacingWheel y las API relacionadas para el plataforma universal de Windows (UWP).This page describes the basics of programming for Xbox One racing wheels using Windows.Gaming.Input.RacingWheel and related APIs for the Universal Windows Platform (UWP).

En esta página encontrarás información sobre:By reading this page, you'll learn:

  • cómo recopilar una lista de ruedas de carreras conectadas y sus usuarioshow to gather a list of connected racing wheels and their users
  • Cómo detectar que se ha agregado o quitado una rueda de carrerashow to detect that a racing wheel has been added or removed
  • Cómo leer datos de una o varias ruedas de carrerahow to read input from one or more racing wheels
  • Cómo enviar comandos de fuerza de respuestahow to send force feedback commands
  • Cómo se comportan los volantes como dispositivos de navegaciónhow racing wheels behave as UI navigation devices

Información general sobre los volantesRacing wheel overview

Los volantes son dispositivos de entrada cuya apariencia se parece mucho a la cabina de un coche de carreras real.Racing wheels are input devices that resemble the feel of a real racecar cockpit. Los volantes son el dispositivo de entrada perfecto para los juegos de carreras de estilo Arcade y simulación que representan coches o camiones.Racing wheels are the perfect input device for both arcade-style and simulation-style racing games that feature cars or trucks. Los volantes son compatibles con aplicaciones para UWP de Windows 10 y Xbox One en el espacio de nombres Windows.Gaming.Input.Racing wheels are supported in Windows 10 and Xbox One UWP apps by the Windows.Gaming.Input namespace.

Las ruedas de las carreras de Xbox One se ofrecen en una gran variedad de puntos de precios, por lo general, con una mayor y mejor funcionalidad de comentarios de entrada y fuerza a medida que aumentan sus puntos de precios.Xbox One racing wheels are offered at a variety of price points, generally having more and better input and force feedback capabilities as their price points rise. Todos los volantes están equipados con una rueda de gobierno analógica, controles de aceleración y frenos analógicos y algunos botones de rueda.All racing wheels are equipped with an analog steering wheel, analog throttle and brake controls, and some on-wheel buttons. Algunos volantes están también equipados con los controles HandBrake y de embrague analógicos, los desfasadors de patrón y las capacidades de fuerza de comentarios.Some racing wheels are additionally equipped with analog clutch and handbrake controls, pattern shifters, and force feedback capabilities. No todos los volantes están equipados con los mismos conjuntos de características, y también pueden variar en su compatibilidad con determinadas características; — por ejemplo, las ruedas de gobierno pueden admitir diferentes intervalos de rotación y los separadores de patrones pueden admitir diferentes números de engranajes.Not all racing wheels are equipped with the same sets of features, and may also vary in their support for certain features—for example, steering wheels might support different ranges of rotation and pattern shifters might support different numbers of gears.

Capacidades del dispositivoDevice capabilities

Diferentes volantes de Xbox One ofrecen diferentes conjuntos de funcionalidades de dispositivo opcionales y distintos niveles de soporte técnico para esas capacidades. este nivel de variación entre un solo tipo de dispositivo de entrada es único entre los dispositivos admitidos por la API de Windows. Gaming. Input .Different Xbox One racing wheels offer different sets of optional device capabilities and varying levels of support for those capabilities; this level of variation between a single kind of input device is unique among the devices supported by the Windows.Gaming.Input API. Además, la mayoría de los dispositivos disponibles admiten como mínimo algunas de las funcionalidades opcionales u otras variaciones.Furthermore, most devices you'll encounter will support at least some optional capabilities or other variations. Por este motivo, es importante determinar las capacidades de cada rueda de carreras conectada individualmente y admitir la variación completa de las funcionalidades que tiene sentido para su juego.Because of this, it's important to determine the capabilities of each connected racing wheel individually and to support the full variation of capabilities that makes sense for your game.

Para obtener más información, consulta Determinar las funcionalidades del volante.For more information, see Determining racing wheel capabilities.

Fuerza de respuestaForce feedback

Algunos volantes de Xbox One ofrecen verdaderas comentarios sobre — la fuerza, por lo que pueden aplicar fuerzas reales en un eje de control, por ejemplo, la rueda de gobierno, — no solo una vibración simple.Some Xbox One racing wheels offer true force feedback—that is, they can apply actual forces on an axis of control such as their steering wheel—not just simple vibration. Los juegos usan esta capacidad para crear una mayor sensación de inmersión (daños en los_bloqueos simulados_, "sensación de carreteras") y aumentar el reto de impulsar bien.Games use this ability to create a greater sense of immersion (simulated crash damage, "road feel") and to increase the challenge of driving well.

Para obtener más información, consulta Información general sobre la fuerza de respuesta.For more information, see Force feedback overview.

Navegación de la interfaz de usuarioUI navigation

Para aliviar la carga de la compatibilidad con los diferentes dispositivos de entrada para la navegación de la interfaz de usuario y fomentar la coherencia entre dispositivos y juegos, la mayoría de dispositivos de entrada física actúan simultáneamente como dispositivo independiente de entrada lógica, llamado controlador de navegación de la interfaz de usuario.In order to ease the burden of supporting the different input devices for user interface navigation and to encourage consistency between games and devices, most physical input devices simultaneously act as a separate logical input device called a UI navigation controller. El controlador de navegación de la interfaz de usuario proporciona un vocabulario común para los comandos de navegación de la interfaz de usuario entre los dispositivos de entrada.The UI navigation controller provides a common vocabulary for UI navigation commands across input devices.

Debido a su focalización exclusiva en los controles analógicos y el grado de variación entre los diferentes volantes, normalmente están equipados con un teclado digital D, vista, menú, a, B, Xe y que se parecen a los de un controlador de juegos. Estos botones no están diseñados para admitir comandos de juego y no se puede acceder a ellos fácilmente como botones de la rueda de carreras.Due to their unique focus on analog controls and the degree of variation between different racing wheels, they're typically equipped with a digital D-pad, View, Menu, A, B, X, and Y buttons that resemble those of a gamepad; these buttons aren't intended to support gameplay commands and can't be readily accessed as racing wheel buttons.

Como controlador de navegación de la interfaz de usuario, los volantes asignan el conjunto necesario de comandos de navegación al Stick izquierdo, el panel D, la vista, el menú, ely el botón B .As a UI navigation controller, racing wheels map the required set of navigation commands to the left thumbstick, D-pad, View, Menu, A, and B buttons.

Comando de navegaciónNavigation command Entrada del volanteRacing wheel input
ArribaUp Cruceta hacia arribaD-pad up
BajarDown Cruceta hacia abajoD-pad down
LeftLeft Cruceta hacia la izquierdaD-pad left
RightRight Cruceta hacia la derechaD-pad right
VerView Botón de vistaView button
MenúMenu Botón de menúMenu button
AcceptAccept Botón AA button
CancelarCancel Botón BB button

Además, algunos volantes pueden asignar algún conjunto opcional de comandos de navegación a otras entradas que admiten, pero las asignaciones de comandos pueden variar de un dispositivo a otro.Additionally, some racing wheels might map some of the optional set of navigation commands to other inputs they support, but command mappings can vary from device to device. Considera la posibilidad de admitir también estos comandos, pero asegúrate de que no son esenciales para navegar por la interfaz del juego.Consider supporting these commands as well, but make sure that these commands are not essential to navigating your game's interface.

Comando de navegaciónNavigation command Entrada del volanteRacing wheel input
Re PágPage Up varíavaries
Av PágPage Down varíavaries
Página a la izquierdaPage Left varíavaries
Página a la derechaPage Right varíavaries
Desplazar hacia arribaScroll Up varíavaries
Desplazar hacia abajoScroll Down varíavaries
Desplazar a la izquierdaScroll Left varíavaries
Desplazar a la derechaScroll Right varíavaries
Contexto 1Context 1 Botón X (normalmente)X Button (commonly)
Contexto 2Context 2 Botón Y (normalmente)Y Button (commonly)
Contexto 3Context 3 varíavaries
Contexto 4Context 4 varíavaries

Detectar y realizar un seguimiento de los volantesDetect and track racing wheels

La detección y el seguimiento de los volantes funcionan exactamente de la misma manera que para los controladores de juegos, excepto con la clase RacingWheel en lugar de la clase de controlador de juegos .Detecting and tracking racing wheels works in exactly the same way as it does for gamepads, except with the RacingWheel class instead of the Gamepad class. Consulte controlador de juegos y vibración para obtener más información.See Gamepad and vibration for more information.

Lectura del volanteReading the racing wheel

Después de identificar los volantes que le interesan, está listo para recopilar datos de los mismos.After you identify the racing wheels that you're interested in, you're ready to gather input from them. Sin embargo, a diferencia de algunos otros tipos de entrada con los que puedes estar familiarizado, los volantes no comunican el cambio de estado mediante la generación de eventos.However, unlike some other kinds of input that you might be used to, racing wheels don't communicate state-change by raising events. En su lugar, puede realizar lecturas regulares de sus Estados actuales mediante su sondeo .Instead, you take regular readings of their current states by polling them.

Sondeo del volantePolling the racing wheel

El sondeo captura una instantánea del volante en un momento preciso en el tiempo.Polling captures a snapshot of the racing wheel at a precise point in time. Este enfoque para la recopilación de entradas es una buena opción para la mayoría de los juegos porque su lógica normalmente se ejecuta en un bucle determinista en lugar de ser controlado por eventos. Normalmente, es más fácil interpretar los comandos del juego a partir de la entrada recopilada todos a la vez que desde muchas entradas únicas recopiladas a lo largo del tiempo.This approach to input gathering is a good fit for most games because their logic typically runs in a deterministic loop rather than being event-driven; it's also typically simpler to interpret game commands from input gathered all at once than it is from many single inputs gathered over time.

Sondear una rueda de carreras llamando a GetCurrentReading; Esta función devuelve un RacingWheelReading que contiene el estado de la rueda de carreras.You poll a racing wheel by calling GetCurrentReading; this function returns a RacingWheelReading that contains the state of the racing wheel.

En el siguiente ejemplo se realiza el sondeo del estado actual de un volante.The following example polls a racing wheel for its current state.

auto racingwheel = myRacingWheels[0];

RacingWheelReading reading = racingwheel->GetCurrentReading();

Además del estado del volante, cada lectura incluye una marca de tiempo que indica con precisión cuándo se recuperó el estado.In addition to the racing wheel state, each reading includes a timestamp that indicates precisely when the state was retrieved. La marca de tiempo es útil para establecer una relación con los intervalos de lecturas anteriores o la duración de la simulación de juego.The timestamp is useful for relating to the timing of previous readings or to the timing of the game simulation.

Determinar las funcionalidades del volanteDetermining racing wheel capabilities

Muchos de los controles del volante son opcionales o admiten diferentes variaciones incluso en los controles necesarios, por lo que tienes que determinar individualmente las funcionalidades de cada volante para poder procesar la entrada que se recopila en cada lectura del volante.Many of the racing wheel controls are optional or support different variations even in the required controls, so you have to determine the capabilities of each racing wheel individually before you can process the input gathered in each reading of the racing wheel.

Los controles opcionales son el freno de mano, el embrague y las palancas de cambios; puedes determinar si un volante conectado admite estos controles mediante la lectura de las propiedades HasHandbrake, HasClutch y HasPatternShifter del volante, respectivamente.The optional controls are the handbrake, clutch, and pattern shifter; you can determine whether a connected racing wheel supports these controls by reading the HasHandbrake, HasClutch, and HasPatternShifter properties of the racing wheel, respectively. Se admite el control si el valor de la propiedad es true; de lo contrario, no se admite.The control is supported if the value of the property is true; otherwise it's not supported.

if (racingwheel->HasHandbrake)
{
    // the handbrake is supported
}

if (racingwheel->HasClutch)
{
    // the clutch is supported
}

if (racingwheel->HasPatternShifter)
{
    // the pattern shifter is supported
}

Además, los controles que pueden variar son el volante y la palanca de cambios.Additionally, the controls that may vary are the steering wheel and pattern shifter. El volante pueden variar según el grado de giro físico que puede admitir el volante real, mientras que la palanca de cambios puede variar según el número de velocidades que admita.The steering wheel can vary by the degree of physical rotation that the actual wheel can support, while the pattern shifter can vary by the number of distinct forward gears it supports. Para determinar el máximo ángulo de rotación que admite el volante real, lee la propiedad MaxWheelAngle del volante; su valor es el ángulo físico máximo que se admite en grados positivos, igual al valor en grados negativos.You can determine the greatest angle of rotation the actual wheel supports by reading the MaxWheelAngle property of the racing wheel; its value is the maximum supported physical angle in degrees clock-wise (positive) which is likewise supported in the counter-clock-wise direction (negative degrees). Puede determinar el mayor engranaje de reenvío que admite el Desfasador de patrones leyendo la MaxPatternShifterGear propiedad de la rueda de carreras; su valor es el mayor soporte de avance compatible, ambos inclusive, — es decir, si su valor es 4, el Desfasador de patrones admite los engranajes invertido, neutro, primero, segundo, tercero y cuarto.You can determine the greatest forward gear the pattern shifter supports by reading the MaxPatternShifterGear property of the racing wheel; its value is the highest forward gear supported, inclusive—that is, if its value is 4, then the pattern shifter supports reverse, neutral, first, second, third, and fourth gears.

auto maxWheelDegrees = racingwheel->MaxWheelAngle;
auto maxShifterGears = racingwheel->MaxPatternShifterGear;

Por último, algunos volantes admiten la fuerza de respuesta a través del volante.Finally, some racing wheels support force feedback through the steering wheel. Puedes determinar si un volante conectado admite la fuerza de respuesta mediante la lectura de la propiedad WheelMotor del volante.You can determine whether a connected racing wheel supports force feedback by reading the WheelMotor property of the racing wheel. Se admite Force Feedback si WheelMotor no es null; de lo contrario, no se admite.Force feedback is supported if WheelMotor is not null; otherwise it's not supported.

if (racingwheel->WheelMotor != nullptr)
{
    // force feedback is supported
}

Para obtener información sobre cómo usar la funcionalidad de fuerza de respuesta de los volantes que la admiten, consulta Información general sobre la fuerza de respuesta.For information on how to use the force feedback capability of racing wheels that support it, see Force feedback overview.

Lectura de los botonesReading the buttons

Cada uno de los botones de la rueda — de carreras las cuatro direcciones del panel D, los botones de engranaje anterior y siguiente , y 16 botones adicionales — proporcionan una lectura digital que indica si está presionado (inactivo) o liberado (arriba).Each of the racing wheel buttons—the four directions of the D-pad, the Previous Gear and Next Gear buttons, and 16 additional buttons—provides a digital reading that indicates whether it's pressed (down) or released (up). Por motivos de eficacia, las lecturas de los botones no se representan como valores booleanos individuales; en su lugar, se empaquetan todas en un único campo de bits que se representa mediante la enumeración RacingWheelButtons.For efficiency, button readings aren't represented as individual boolean values; instead they're all packed into a single bitfield that's represented by the RacingWheelButtons enumeration.

Nota

Los volantes están equipados con botones adicionales que se usan para la navegación de la interfaz de usuario, como los botones de vista y de menú .Racing wheels are equipped with additional buttons used for UI navigation such as the View and Menu buttons. Estos botones no forman parte de la enumeración RacingWheelButtons y solo se pueden leer accediendo al volante como dispositivo de navegación de la interfaz de usuario.These buttons are not a part of the RacingWheelButtons enumeration and can only be read by accessing the racing wheel as a UI navigation device. Para obtener más información, consulta UI Navigation Device (Dispositivo de navegación de la interfaz de usuario).For more information, see UI Navigation Device.

Los valores de los botones se leen en la propiedad Buttons de la estructura RacingWheelReading.The button values are read from the Buttons property of the RacingWheelReading structure. Dado que esta propiedad es un campo de bits, se usa el enmascaramiento bit a bit para aislar el valor del botón que te interesa.Because this property is a bitfield, bitwise masking is used to isolate the value of the button that you're interested in. El botón está presionado (abajo) cuando se establece el bit correspondiente; de lo contrario, se libera (up).The button is pressed (down) when the corresponding bit is set; otherwise, it's released (up).

En el ejemplo siguiente, se determina si el botón Next Gear está presionado.The following example determines whether the Next Gear button is pressed.

if (RacingWheelButtons::NextGear == (reading.Buttons & RacingWheelButtons::NextGear))
{
    // Next Gear is pressed
}

En el ejemplo siguiente, se determina si el botón Next Gear está liberado.The following example determines whether the Next Gear button is released.

if (RacingWheelButtons::None == (reading.Buttons & RacingWheelButtons::NextGear))
{
    // Next Gear is released (not pressed)
}

En ocasiones, es posible que desee determinar si un botón cambia de presionado a liberado o liberado a presionado, si se presionan o se liberan varios botones, o si un conjunto de botones se organizan de una manera determinada — , pero no.Sometimes you might want to determine when a button transitions from pressed to released or released to pressed, whether multiple buttons are pressed or released, or if a set of buttons are arranged in a particular way—some pressed, some not. Para obtener información sobre cómo detectar estas condiciones, consulta Detección de transiciones de botón y Detección disposiciones de botones complejas.For information on how to detect these conditions, see Detecting button transitions and Detecting complex button arrangements.

Lectura del volanteReading the wheel

El volante es un control necesario que proporciona una lectura analógica entre -1,0 y + 1,0.The steering wheel is a required control that provides an analog reading between -1.0 and +1.0. Un valor de -1,0 corresponde a la posición más a la izquierda del volante; un valor de + 1,0 corresponde a la posición más a la derecha.A value of -1.0 corresponds to the left-most wheel position; a value of +1.0 corresponds to the right-most position. El valor del volante se lee en la propiedad Wheel de la estructura RacingWheelReading.The value of the steering wheel is read from the Wheel property of the RacingWheelReading structure.

float wheel = reading.Wheel;  // returns a value between -1.0 and +1.0.

Aunque las lecturas del volante corresponden a los distintos grados de rotación física del volante real según el rango de rotación que admite el volante físico, lo habitual no es escalar las lecturas del volante; los volantes que admiten mayores grados de rotación simplemente proporcionan una mayor precisión.Although wheel readings correspond to different degrees of physical rotation in the actual wheel depending on the range of rotation supported by the physical racing wheel, you don't usually want to scale the wheel readings; wheels that support greater degrees of rotation just provide greater precision.

Lectura del acelerador y el frenoReading the throttle and brake

El acelerador y el freno son controles obligatorios, cada uno de los cuales proporciona lecturas analógicas entre 0,0 (completamente liberado) y 1,0 (totalmente presionado) representados como valores de punto flotante.The throttle and brake are required controls that each provide analog readings between 0.0 (fully released) and 1.0 (fully pressed) represented as floating-point values. El valor del control del acelerador se lee en la propiedad Throttle de la estructura RacingWheelReading; el valor del control del freno se lee en la propiedad Brake.The value of the throttle control is read from the Throttle property of the RacingWheelReading struct; the value of the brake control is read from the Brake property.

float throttle = reading.Throttle;  // returns a value between 0.0 and 1.0
float brake    = reading.Brake;     // returns a value between 0.0 and 1.0

Lectura del freno de mano y el embragueReading the handbrake and clutch

El freno de mano y el embrague son controles opcionales, cada uno de los cuales proporciona lecturas analógicas entre 0,0 (totalmente liberado) y 1,0 (totalmente accionado), que se representan como valores de punto flotante.The handbrake and clutch are optional controls that each provide analog readings between 0.0 (fully released) and 1.0 (fully engaged) represented as floating-point values. El valor del control del freno de mano se lee en la propiedad Handbrake de la estructura RacingWheelReading; el valor del control del embrague se lee en la propiedad Clutch.The value of the handbrake control is read from the Handbrake property of the RacingWheelReading struct; the value of the clutch control is read from the Clutch property.

float handbrake = 0.0;
float clutch = 0.0;

if(racingwheel->HasHandbrake)
{
    handbrake = reading.Handbrake;  // returns a value between 0.0 and 1.0
}

if(racingwheel->HasClutch)
{
    clutch = reading.Clutch;        // returns a value between 0.0 and 1.0
}

Lectura de la palanca de cambiosReading the pattern shifter

La palanca de cambios es un control opcional que proporciona una lectura digital entre -1 y MaxPatternShifterGear, que se representa como un valor entero con signo.The pattern shifter is an optional control that provides a digital reading between -1 and MaxPatternShifterGear represented as a signed integer value. Un valor de-1 o 0 corresponde a los engranajes inversos y neutros , respectivamente; los valores cada vez más positivos se corresponden con un mayor avance hasta MaxPatternShifterGear, ambos inclusive.A value of -1 or 0 correspond to the reverse and neutral gears, respectively; increasingly positive values correspond to greater forward gears up to MaxPatternShifterGear, inclusive. El valor del Desfasador de patrón se lee de la propiedad PatternShifterGear del struct RacingWheelReading .The value of the pattern shifter is read from the PatternShifterGear property of the RacingWheelReading struct.

if (racingwheel->HasPatternShifter)
{
    gear = reading.PatternShifterGear;
}

Nota

El Desfasador de patrones, donde se admite, existe junto a los botones de engranaje y siguiente engranaje necesarios, que también afectan al engranaje actual del coche del jugador.The pattern shifter, where supported, exists alongside the required Previous Gear and Next Gear buttons which also affect the current gear of the player's car. Una estrategia sencilla para unificar estas entradas cuando ambos están presentes es pasar por alto el Desfasador de patrón (y el embrague) cuando un jugador elige una transmisión automática para su coche y omitir los botones de engranaje anterior y siguiente cuando un jugador elige una transmisión manual para su automóvil solo si su rueda de carreras está equipada con un control de Desfasador de patrón.A simple strategy for unifying these inputs where both are present is to ignore the pattern shifter (and clutch) when a player chooses an automatic transmission for their car, and to ignore the Previous and Next Gear buttons when a player chooses a manual transmission for their car only if their racing wheel is equipped with a pattern shifter control. Puedes implementar una estrategia de unificación diferente si esta no te resulta adecuada para el juego.You can implement a different unification strategy if this isn't suitable for your game.

Ejecución de la muestra de InputInterfacingRun the InputInterfacing sample

La muestra InputInterfacingUWP (GitHub) ilustra cómo usar los volantes y los distintos tipos de dispositivos de entrada conjuntamente, así como el comportamiento de estos dispositivos de entrada como controladores de navegación de la interfaz de usuario.The InputInterfacingUWP sample (github) demonstrates how to use racing wheels and different kinds of input devices in tandem, as well as how these input devices behave as UI navigation controllers.

Información general sobre la fuerza de respuestaForce feedback overview

Muchos volantes tienen capacidad de fuerza de respuesta para proporcionar una experiencia de conducción más envolvente y desafiante.Many racing wheels have force feedback capability to provide a more immersive and challenging driving experience. Los volantes que admiten la fuerza de respuesta suelen estar equipados con un motor único que aplica fuerza al volante a lo largo de un solo eje: el eje de rotación del volante.Racing wheels that support force feedback are typically equipped with a single motor that applies force to the steering wheel along a single axis, the axis of wheel rotation. Los comentarios de fuerza se admiten en aplicaciones de UWP de Windows 10 y Xbox One mediante el espacio de nombres Windows. Gaming. Input. ForceFeedback .Force feedback is supported in Windows 10 and Xbox One UWP apps by the Windows.Gaming.Input.ForceFeedback namespace.

Nota

Las API de Force Feedback son capaces de admitir varios ejes de fuerza, pero ninguna rueda de carreras de Xbox One es compatible actualmente con ningún eje de comentarios que no sea el de rotación de la rueda.The force feedback APIs are capable of supporting several axes of force, but no Xbox One racing wheel currently supports any feedback axis other than that of wheel rotation.

Uso de la fuerza de respuestaUsing force feedback

En estas secciones se describen los conceptos básicos de programación de los efectos de la fuerza de respuesta para los volantes de Xbox One.These sections describe the basics of programming force feedback effects for Xbox One racing wheels. La respuesta se aplica mediante efectos, que se cargan por primera vez en el dispositivo de fuerza de respuesta y, luego, se pueden iniciar, pausar, reanudar y detener de manera similar a los efectos de sonido; sin embargo, primero debes determinar las funcionalidades de respuesta del volante.Feedback is applied using effects, which are first loaded onto the force feedback device and then can be started, paused, resumed, and stopped in a manner similar to sound effects; however, you must first determine the feedback capabilities of the racing wheel.

Determinar las funcionalidades de fuerza de respuestaDetermining force feedback capabilities

Puedes determinar si un volante conectado admite la fuerza de respuesta mediante la lectura de la propiedad WheelMotor del volante.You can determine whether a connected racing wheel supports force feedback by reading the WheelMotor property of the racing wheel. Los comentarios de fuerza no se admiten si WheelMotor es null; de lo contrario, se admite la fuerza de comentarios y puede continuar para determinar las capacidades de comentarios específicas del motor, como los ejes a los que puede afectar.Force feedback isn't supported if WheelMotor is null; otherwise, force feedback is supported and you can proceed to determine the specific feedback capabilities of the motor, such as the axes it can affect.

if (racingwheel->WheelMotor != nullptr)
{
    auto axes = racingwheel->WheelMotor->SupportedAxes;

    if(ForceFeedbackEffectAxes::X == (axes & ForceFeedbackEffectAxes::X))
    {
        // Force can be applied through the X axis
    }

    if(ForceFeedbackEffectAxes::Y == (axes & ForceFeedbackEffectAxes::Y))
    {
        // Force can be applied through the Y axis
    }

    if(ForceFeedbackEffectAxes::Z == (axes & ForceFeedbackEffectAxes::Z))
    {
        // Force can be applied through the Z axis
    }
}

Carga de los efectos de la fuerza de respuestaLoading force feedback effects

Los efectos de la fuerza de respuesta se cargan en el dispositivo de respuesta donde se "reproducen" de forma autónoma en el comando del juego.Force feedback effects are loaded onto the feedback device where they are "played" autonomously at the command of your game. Se proporcionan varios efectos básicos; los efectos personalizados se pueden crear a través de una clase que implementa la interfaz IForceFeedbackEffect .A number of basic effects are provided; custom effects can be created through a class that implements the IForceFeedbackEffect interface.

Clase de efectoEffect class Descripción del efectoEffect description
ConditionForceEffectConditionForceEffect Efecto que aplica una fuerza variable en respuesta a un sensor actual dentro del dispositivo.An effect that applies variable force in response to current sensor within the device.
ConstantForceEffectConstantForceEffect Efecto que aplica una fuerza constante a lo largo de un vector.An effect that applies constant force along a vector.
PeriodicForceEffectPeriodicForceEffect Efecto que aplica una fuerza variable definida por una forma de onda, a lo largo de un vector.An effect that applies variable force defined by a waveform, along a vector.
RampForceEffectRampForceEffect Efecto que aplica una fuerza linealmente creciente o decreciente a lo largo de un vector.An effect that applies a linearly increasing/decreasing force along a vector.
using FFLoadEffectResult = ForceFeedback::ForceFeedbackLoadEffectResult;

auto effect = ref new Windows.Gaming::Input::ForceFeedback::ConstantForceEffect();
auto time = TimeSpan(10000);

effect->SetParameters(Windows::Foundation::Numerics::float3(1.0f, 0.0f, 0.0f), time);

// Here, we assume 'racingwheel' is valid and supports force feedback

IAsyncOperation<FFLoadEffectResult>^ request
    = racingwheel->WheelMotor->LoadEffectAsync(effect);

auto loadEffectTask = Concurrency::create_task(request);

loadEffectTask.then([this](FFLoadEffectResult result)
{
    if (FFLoadEffectResult::Succeeded == result)
    {
        // effect successfully loaded
    }
    else
    {
        // effect failed to load
    }
}).wait();

Uso de los efectos de la fuerza de respuestaUsing force feedback effects

Una vez cargados, los efectos se pueden iniciar, pausar, reanudar y detener de forma sincrónica llamando a funciones en la propiedad WheelMotor del volante, o bien individualmente llamando a las funciones del propio efecto de respuesta.Once loaded, effects can all be started, paused, resumed, and stopped synchronously by calling functions on the WheelMotor property of the racing wheel, or individually by calling functions on the feedback effect itself. Por lo general, se deben cargar todos los efectos que se quieren usar en el dispositivo de respuesta antes de que comience el juego y, luego, usar sus respectivas funciones SetParameters para actualizar los efectos a medida que el juego avanza.Typically, you should load all the effects that you want to use onto the feedback device before gameplay begins and then use their respective SetParameters functions to update the effects as gameplay progresses.

if (ForceFeedbackEffectState::Running == effect->State)
{
    effect->Stop();
}
else
{
    effect->Start();
}

Por último, se puede habilitar, deshabilitar o restablecer de forma asincrónica todo el sistema de fuerza de respuesta en un volante concreto cuando sea necesario.Finally, you can asynchronously enable, disable, or reset the entire force feedback system on a particular racing wheel whenever you need.

Vea tambiénSee also