Volante de corrida e force feedbackRacing wheel and force feedback

Esta página descreve as noções básicas de programação para rodas de uma corrida do Xbox usando Windows. games. Input. RacingWheel e APIs relacionadas para o plataforma universal do 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).

Ao ler esta página, você saberá como:By reading this page, you'll learn:

  • obter uma lista de volantes de corrida conectados e os usuárioshow to gather a list of connected racing wheels and their users
  • detectar se um volante de corrida foi adicionado ou removidohow to detect that a racing wheel has been added or removed
  • ler entradas de um ou mais volantes de corridahow to read input from one or more racing wheels
  • enviar comandos de force feedbackhow to send force feedback commands
  • como volantes de corrida se comportam como um dispositivo de navegação da interface do usuáriohow racing wheels behave as UI navigation devices

Visão geral do volante de corridaRacing wheel overview

Volantes de corrida são dispositivos de entrada que reproduzem a sensação do cockpit de um carro de corrida real.Racing wheels are input devices that resemble the feel of a real racecar cockpit. Volantes de corrida são o dispositivo de entrada perfeito para jogos de corrida em estilos arcade e simulação com carros ou caminhões.Racing wheels are the perfect input device for both arcade-style and simulation-style racing games that feature cars or trucks. Os volantes de corrida são compatíveis em aplicativos UWP do Windows 10 e do Xbox One pelo namespace Windows.Gaming.Input.Racing wheels are supported in Windows 10 and Xbox One UWP apps by the Windows.Gaming.Input namespace.

Os volantes de corrida do Xbox One são oferecidos em uma grande variedade de faixas de preço com entrada e funcionalidades de force feedback melhores à medida que as faixas de preços sobem.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 os volantes de corrida estão equipados com um volante analógico, controles de aceleração e freio analógicos e alguns botões no volante.All racing wheels are equipped with an analog steering wheel, analog throttle and brake controls, and some on-wheel buttons. Além disso, alguns volantes de corrida estão equipados com controles de embreagem e freio de mão analógicos, borboletas de câmbio e funcionalidades de force feedback.Some racing wheels are additionally equipped with analog clutch and handbrake controls, pattern shifters, and force feedback capabilities. Nem todos os volantes de corrida estão equipados com os mesmos conjuntos de recursos e também podem variar no suporte para determinados recursos, por exemplo, os volantes podem suportar graus de esterçamento diferentes e as borboletas de câmbio podem suportar números de marchas diferentes.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.

Funcionalidades de dispositivoDevice capabilities

Diferentes rodas do Xbox uma corrida oferecem diferentes conjuntos de recursos de dispositivo opcionais e níveis variados de suporte para esses recursos; esse nível de variação entre um único tipo de dispositivo de entrada é exclusivo entre os dispositivos com suporte da API 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. Além disso, a maioria dos dispositivos que você encontrará dará suporte a pelo menos alguma funcionalidade opcional ou outras variações.Furthermore, most devices you'll encounter will support at least some optional capabilities or other variations. Por isso, é importante determinar as funcionalidades de cada volante de corrida conectado individualmente e dar suporte a toda a variação de funcionalidades justificável para o jogo.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 obter mais informações, consulte Determinar funcionalidades de volante de corrida.For more information, see Determining racing wheel capabilities.

Force feedbackForce feedback

Alguns volantes de corrida do Xbox One oferecem o force feedback real, ou seja, eles podem aplicar forças reais em um eixo de controle como no volante, e não uma simples vibração.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. Os jogos usam essa funcionalidade para criar uma sensação maior de imersão (dano por batida simulado, "sensação da estrada") e aumentar o desafio de guiar bem.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 obter mais informações, consulte Visão geral do force feedback.For more information, see Force feedback overview.

Navegação da interface do usuárioUI navigation

Para aliviar a sobrecarga do suporte para diferentes dispositivos de entrada para a navegação de interface do usuário e para incentivar a consistência entre dispositivos e jogos, os dispositivos de entrada mais físicos atuam simultaneamente como um dispositivo de entrada lógico separado chamado de controlador de navegação da interface do usuário.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. O controlador de navegação da interface do usuário fornece um vocabulário comum para comandos de navegação da interface do usuário em dispositivos de entrada.The UI navigation controller provides a common vocabulary for UI navigation commands across input devices.

Por causa do foco exclusivo sobre controles analógicos e o grau de variação entre volantes de corrida diferentes, eles normalmente estão equipados com um direcional digital, botões Exibir, Menu, A, B, X e Y que se assemelham aos de um gamepad; esses botões não devem dar suporte a comandos de jogo e não podem ser prontamente acessados como botões de volante de corrida.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 um controlador de navegação de interface do usuário, as rodas de corrida mapeiam o conjunto necessário de comandos de navegação para os botões esquerdo Thumbstick, D-pad, View, menu, ae 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 NavegaçãoNavigation command Entrada do volante de corridaRacing wheel input
UpUp Direcional para cimaD-pad up
DownDown Direcional para baixoD-pad down
EsquerdaLeft Direcional para a esquerdaD-pad left
DireitaRight Direcional para a direitaD-pad right
VisualizarView Botão ExibirView button
MenuMenu Botão MenuMenu button
AceitarAccept Botão AA button
CancelarCancel Botão BB button

Além disso, alguns volantes de corrida podem mapear alguns dos comandos de navegação do conjunto opcional para outras entradas compatíveis, mas os mapeamentos de comando podem variar de um dispositivo para outro.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. Também leve em consideração o suporte a esses comandos, mas certifique-se de que esses comandos não sejam essenciais para navegar na interface do jogo.Consider supporting these commands as well, but make sure that these commands are not essential to navigating your game's interface.

Comando NavegaçãoNavigation command Entrada do volante de corridaRacing wheel input
Page UpPage Up consoantevaries
Page DownPage Down consoantevaries
Página à esquerdaPage Left consoantevaries
Página à direitaPage Right consoantevaries
Role para cimaScroll Up consoantevaries
Rolar para baixoScroll Down consoantevaries
Rolar para a esquerdaScroll Left consoantevaries
Rolar para a direitaScroll Right consoantevaries
Contexto 1Context 1 Botão X (normalmente)X Button (commonly)
Contexto 2Context 2 Botão Y (normalmente)Y Button (commonly)
Contexto 3Context 3 consoantevaries
Contexto 4Context 4 consoantevaries

Detectar e acompanhar volantes de corridaDetect and track racing wheels

A detecção e o acompanhamento de joysticks para simulador de voo funcionam exatamente da mesma forma nos gamepads, exceto na classe RacingWheel em vez da classe Gamepad.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 Gamepad e vibração para obter mais informações.See Gamepad and vibration for more information.

Como ler o volante de corridaReading the racing wheel

Depois de identificar os volantes de corrida de interesse, você estará pronto para coletar informações dele.After you identify the racing wheels that you're interested in, you're ready to gather input from them. No entanto, diferentemente de outros tipos de entrada com os quais você possa estar acostumado, os volantes de corrida não informam a alteração de estado acionando eventos.However, unlike some other kinds of input that you might be used to, racing wheels don't communicate state-change by raising events. Você faz leituras regulares do estado atual deles fazendo uma sondagem.Instead, you take regular readings of their current states by polling them.

Como sondar o volante de corridaPolling the racing wheel

A sondagem registra um instantâneo do volante de corrida em um momento preciso.Polling captures a snapshot of the racing wheel at a precise point in time. Essa abordagem de coleta de entrada é ótima para a maioria dos jogos, pois sua lógica normalmente é executada em um loop determinante em vez de ser orientada por evento; também é normalmente mais simples interpretar os comandos de jogos da entrada coletada de uma vez do que de várias entradas individuais coletadas ao longo do tempo.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.

Você sonda um volante de corrida chamando GetCurrentReading; essa função retorna um RacingWheelReading que contém o estado do volante de corrida.You poll a racing wheel by calling GetCurrentReading; this function returns a RacingWheelReading that contains the state of the racing wheel.

O exemplo a seguir faz a sondagem de um volante de corrida para saber o estado atual.The following example polls a racing wheel for its current state.

auto racingwheel = myRacingWheels[0];

RacingWheelReading reading = racingwheel->GetCurrentReading();

Além do estado do volante de corrida, cada leitura inclui um carimbo de data e hora que indica precisamente quando o estado foi recuperado.In addition to the racing wheel state, each reading includes a timestamp that indicates precisely when the state was retrieved. O carimbo de data e hora é útil para estabelecer a relação entre o tempo das leituras anteriores e o tempo da simulação do jogo.The timestamp is useful for relating to the timing of previous readings or to the timing of the game simulation.

Como determinar funcionalidades do volante de corridaDetermining racing wheel capabilities

Muitos dos controles de volante de corrida são opcionais ou dão suporte a variações diferentes mesmo nos controles obrigatórios. Portanto, você precisa determinar as funcionalidades de cada volante de corrida individualmente para poder processar a entrada coletada em cada leitura do volante de corrida.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.

Os controles opcionais são o freio de mão, a embreagem e a borboleta de câmbio; você pode determinar se um volante de corrida conectado dá suporte a esses controles lendo as propriedades HasHandbrake, HasClutch e HasPatternShifter do volante de corrida, 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. O controle terá suporte se o valor da propriedade for true; caso contrário, não haverá suporte.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
}

Além disso, os controles que podem variar são o volante de corrida e a borboleta de câmbio.Additionally, the controls that may vary are the steering wheel and pattern shifter. O volante de corrida pode variar de acordo com o grau de esterçamento físico que o volante real pode suportar, e a borboleta de cambio pode variar de acordo com o número de marchas à frente que ele suporta.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. Você pode determinar o maior ângulo de esterçamento a que o volante real dá suporte lendo a propriedade MaxWheelAngle do volante de corrida; o valor é o ângulo físico suportado máximo em graus no sentido horário (positivo), suportado da mesma forma no sentido anti-horário (graus 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). Você pode determinar o maior marcha à frente a que a borboleta de câmbio dá suporte lendo a propriedade MaxPatternShifterGear do volante de corrida; o valor é a maior marcha à frente suportada, inclusive—ou seja, se o valor for 4, a borboleta de câmbio dará suporte a ré, neutro, primeira, segunda, terceira e quarta marchas.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 fim, alguns volantes de corrida são suporte a force feedback por meio do volante de corrida.Finally, some racing wheels support force feedback through the steering wheel. Você pode determinar se um volante de corrida conectado dá suporte a force feedback lendo a propriedade WheelMotor do volante de corrida.You can determine whether a connected racing wheel supports force feedback by reading the WheelMotor property of the racing wheel. O force feedback terá suporte se WheelMotor não for nulo; caso contrário, não haverá suporte.Force feedback is supported if WheelMotor is not null; otherwise it's not supported.

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

Para obter informações sobre como usar a funcionalidade de force feedback dos volantes de corrida compatíveis, consulte Visão geral do force feedback.For information on how to use the force feedback capability of racing wheels that support it, see Force feedback overview.

Lendo os botõesReading the buttons

Cada um dos botões do volante de corrida—as quatro direções do direcional, os botões Marcha anterior e Marcha posterior e os 16 botões adicionais—oferecem uma leitura digital que indica se ele está pressionado (para baixo) ou liberado (para cima).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). Para garantir a eficiência, as leituras dos botões não são representadas como valores boolianos individuais; elas são empacotadas em um único campo de bits representado pela enumeração 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.

Observação

Os volantes de corrida são equipados com botões adicionais usados para navegação na interface do usuário, como os botões Exibir e Menu.Racing wheels are equipped with additional buttons used for UI navigation such as the View and Menu buttons. Esses botões não fazem parte da enumeração RacingWheelButtons e só podem ser lidos acessando-se o volante de corrida como um dispositivo de navegação da interface do usuário.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 obter mais informações, consulte Dispositivo de navegação da interface do usuário.For more information, see UI Navigation Device.

Os valores dos botões são lidos pela propriedade Buttons da estrutura RacingWheelReading.The button values are read from the Buttons property of the RacingWheelReading structure. Como essa propriedade é um campo de bits, o mascaramento bit a bit é usado para isolar o valor do botão de seu interesse.Because this property is a bitfield, bitwise masking is used to isolate the value of the button that you're interested in. O botão está pressionado (para baixo) quando o bit correspondente está definido; caso contrário, ele está liberado (para acima).The button is pressed (down) when the corresponding bit is set; otherwise, it's released (up).

O exemplo a seguir determina se o botão Marcha posterior é pressionado.The following example determines whether the Next Gear button is pressed.

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

O exemplo a seguir determina se o botão Marcha posterior é 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)
}

Às vezes, convém determinar quando um botão passa de pressionado para liberado ou vice-versa, se vários botões foram pressionados ou liberados ou se um conjunto de botões está organizado de determinada maneira — alguns pressionados, outros, não.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 obter informações sobre como detectar essas condições, consulte Detectando transições do botão e Detectando organizações complexas de botão.For information on how to detect these conditions, see Detecting button transitions and Detecting complex button arrangements.

Como ler o volanteReading the wheel

O volante é um controle obrigatório que fornece uma leitura analógica entre -1,0 e +1,0.The steering wheel is a required control that provides an analog reading between -1.0 and +1.0. Um valor -1,0 corresponde à posição mais à esquerda do volante; um valor + 1,0 corresponde à posição mais à direita.A value of -1.0 corresponds to the left-most wheel position; a value of +1.0 corresponds to the right-most position. O valor do volante é lido com base na propriedade Wheel da estrutura 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.

Embora as leituras do volante correspondam a graus diferentes de esterçamento físico no volante real, dependendo da faixa de esterçamento compatível com o volante de corrida físico, você normalmente não quer dimensionar as leituras do volante; volantes compatíveis com graus de esterçamento maiores acabam proporcionando mais precisão.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.

Como ler o acelerador e o freioReading the throttle and brake

O acelerador e o freio são controles obrigatórios que fornecem leituras analógicas entre 0,0 (totalmente liberados) e 1,0 (totalmente pressionados) representadas como valores de ponto flutuante.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. O valor de controle do acelerador é lido com base na propriedade Throttle do struct RacingWheelReading; o valor de controle do freio é lido com base na propriedade 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

Como ler o freio de mão e a embreagemReading the handbrake and clutch

O freio de mão e a embreagem são controles opcionais que fornecem leituras analógicas entre 0,0 (totalmente liberados) e 1,0 (totalmente acionados) representados como valores de ponto flutuante.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. O valor de controle do freio de mão é lido com base na propriedade Handbrake do struct RacingWheelReading; o valor de controle da embreagem é lido com base na propriedade 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
}

Como ler a borboleta de câmbioReading the pattern shifter

A borboleta de câmbio é um controle opcional que fornece uma leitura digital entre -1 e MaxPatternShifterGear representada como um valor de inteiro assinado.The pattern shifter is an optional control that provides a digital reading between -1 and MaxPatternShifterGear represented as a signed integer value. Um valor -1 ou 0 corresponde às marchas a ré e neutra marcha, respectivamente; valores cada vez mais positivos correspondem a marchas à frente mais altas até MaxPatternShifterGear, 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. O valor do deslocamento de padrão é lido na propriedade PatternShifterGear do struct RacingWheelReading .The value of the pattern shifter is read from the PatternShifterGear property of the RacingWheelReading struct.

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

Observação

A borboleta de câmbio, quando compatível, fica ao lado dos botões de Marcha anterior e Posterior obrigatórios, o que também afeta a marcha atual do carro do jogador.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. Uma estratégia simple para unificar essas entradas nas quais ambos estejam presentes é ignorar a borboleta de câmbio (e a embreagem) quando um jogador escolhe uma transmissão automática para o carro e só ignorar os botões de Marcha anterior e posterior quando um jogador escolhe uma transmissão manual para o carro caso o volante de corrida esteja equipado com uma borboleta de câmbio.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. Será possível implementar uma estratégia de unificação diferente se ela não for indicada para o jogo.You can implement a different unification strategy if this isn't suitable for your game.

Executar a amostra InputInterfacingRun the InputInterfacing sample

O exemplo InputInterfacingUWP (github) demonstra como usar volantes de corrida e diferentes tipos de dispositivos de entrada em conjunto, além de como esses dispositivos de entrada se comportam como controladores de navegação da interface do usuário.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.

Visão geral do force feedbackForce feedback overview

Muitos volantes de corrida têm a funcionalidade de force feedback para oferecer uma experiência de direção mais imersiva e desafiadora.Many racing wheels have force feedback capability to provide a more immersive and challenging driving experience. Os volantes de corrida compatíveis com force feedback normalmente são equipados com um único motor que aplica força ao volante ao longo de um único eixo, o eixo de esterçamento do 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. Há suporte para a força de comentários nos aplicativos Windows 10 e Xbox One UWP pelo namespace Windows. Gaming. Input. ForceFeedback .Force feedback is supported in Windows 10 and Xbox One UWP apps by the Windows.Gaming.Input.ForceFeedback namespace.

Observação

As APIs de force feedback são capazes de dar suporte a diversos eixos de força, mas nenhum volante de corrida do Xbox One atualmente dá suporte a qualquer eixo de feedback que não seja de esterçamento do volante.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.

Como usar force feedbackUsing force feedback

Estas seções descrevem as noções básicas de programação dos efeitos de force feedback para volantes de corrida do Xbox One.These sections describe the basics of programming force feedback effects for Xbox One racing wheels. O feedback é aplicado usando-se efeitos, que são carregados primeiramente sobre o dispositivo de force feedback e, em seguida, podem ser iniciados, pausados, retomados e interrompidos de maneira semelhante a efeitos sonoros. No entanto, você deve primeiro determinar as funcionalidades de feedback do volante de corrida.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.

Como determinar funcionalidades de force feedbackDetermining force feedback capabilities

Você pode determinar se um volante de corrida conectado dá suporte a force feedback lendo a propriedade WheelMotor do volante de corrida.You can determine whether a connected racing wheel supports force feedback by reading the WheelMotor property of the racing wheel. O force feedback não será compatível se WheelMotor for null. Do contrário, force feedback será compatível, e será possível continuar para determinar as funcionalidades de feedback específicas do motor, como os eixos que ele pode afetar.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
    }
}

Como carregar efeitos de force feedbackLoading force feedback effects

Os efeitos de force feedback são carregados no dispositivo de feedback no qual são "executados" de maneira autônoma no comando do jogo.Force feedback effects are loaded onto the feedback device where they are "played" autonomously at the command of your game. Vários efeitos básicos são fornecidos; os efeitos personalizados podem ser criados por meio de uma classe que implementa a interface IForceFeedbackEffect .A number of basic effects are provided; custom effects can be created through a class that implements the IForceFeedbackEffect interface.

Classe de efeitoEffect class Descrição de efeitoEffect description
ConditionForceEffectConditionForceEffect Um efeito que aplica força variável em resposta ao sensor atual dentro do dispositivo.An effect that applies variable force in response to current sensor within the device.
ConstantForceEffectConstantForceEffect Um efeito que aplica força constante ao longo de um vetor.An effect that applies constant force along a vector.
PeriodicForceEffectPeriodicForceEffect Um efeito que aplica força variável definida por uma forma de onda ao longo de um vetor.An effect that applies variable force defined by a waveform, along a vector.
RampForceEffectRampForceEffect Um efeito que aplica uma força que aumenta/diminui de maneira linear ao longo de um vetor.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();

Como usar efeitos de force feedbackUsing force feedback effects

Depois de carregados, os efeitos podem ser todos iniciados, pausados, retomados e interrompidos de maneira síncrona chamando funções na propriedade WheelMotor do volante de corrida ou individual chamando funções sobre o efeito de feedback propriamente dito.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. Normalmente, você deve carregar todos os efeitos que deseja usar no dispositivo de feedback antes do jogo começar e, em seguida, usar as respectivas funções SetParameters para atualizar os efeitos à medida que o jogo avança.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 fim, é possível habilitar, desabilitar ou redefinir de maneira assíncrona todo o sistema de force feedback em um determinado volante sempre que precisar.Finally, you can asynchronously enable, disable, or reset the entire force feedback system on a particular racing wheel whenever you need.

Veja tambémSee also