Volante da corsa e force feedbackRacing wheel and force feedback

Questa pagina descrive le nozioni di base della programmazione per le ruote Xbox One Racing usando Windows. Gaming. input. RacingWheel e le API correlate per il piattaforma UWP (Universal Windows Platform) (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).

Leggendo questa pagina scoprirai:By reading this page, you'll learn:

  • come raccogliere un elenco di ruote da corsa connesse e dei relativi utentihow to gather a list of connected racing wheels and their users
  • come rilevare che è stata aggiunta o rimossa una ruota da corsahow to detect that a racing wheel has been added or removed
  • come leggere l'input da una o più ruote da corsahow to read input from one or more racing wheels
  • come inviare comandi di force feedbackhow to send force feedback commands
  • comportamento delle ruote da corsa come dispositivi di spostamento dell'interfaccia utentehow racing wheels behave as UI navigation devices

Panoramica sui volanti da corsaRacing wheel overview

I volanti da corsa sono dispositivi di input che simulano l'interno dell'abitacolo di un'auto da corsa.Racing wheels are input devices that resemble the feel of a real racecar cockpit. I volanti da corsa sono dispositivi di input ideali per giochi di corse in stile Arcade e simulazione con auto o camion.Racing wheels are the perfect input device for both arcade-style and simulation-style racing games that feature cars or trucks. I volanti da corsa sono supportati nelle app UWP per Windows 10 e Xbox One tramite lo spazio dei nomi Windows.Gaming.Input.Racing wheels are supported in Windows 10 and Xbox One UWP apps by the Windows.Gaming.Input namespace.

Le ruote di Xbox One Racing sono offerte a una varietà di punti di prezzo, con funzionalità di input e forzatura migliori e più efficaci per l'incremento dei punti di prezzo.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. Tutte le ruote Racing sono dotate di una rotellina di sterzo analoga, di una limitazione analoga e di controlli freno e di alcuni pulsanti su rotellina.All racing wheels are equipped with an analog steering wheel, analog throttle and brake controls, and some on-wheel buttons. Alcune ruote da corsa sono dotate anche di controlli di frizione e freno a mano, di spostamento e di forzare i feedback.Some racing wheels are additionally equipped with analog clutch and handbrake controls, pattern shifters, and force feedback capabilities. Non tutte le ruote da corsa sono dotate degli stessi set di funzionalità e possono anche variare in base al supporto di alcune funzionalità — . ad esempio, le ruote di sterzo potrebbero supportare diversi intervalli di rotazione e i dispositivi di spostamento dei modelli potrebbero supportare numeri diversi di ingranaggio.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.

Funzionalità di dispositivoDevice capabilities

Diverse ruote Xbox One Racing offrono diversi set di funzionalità facoltative per i dispositivi e diversi livelli di supporto per queste funzionalità. Questo livello di variazione tra un solo tipo di dispositivo di input è univoco tra i dispositivi supportati dall'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. Inoltre, la maggior parte dei dispositivi supporteranno almeno alcune funzionalità opzionali o altre varianti.Furthermore, most devices you'll encounter will support at least some optional capabilities or other variations. Per questo motivo, è importante determinare le funzionalità di ogni rotellina per le corse connesse singolarmente e supportare la variazione completa delle funzionalità che risultano sensate per il gioco.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.

Per ulteriori informazioni, vedi Determinare le funzionalità del volante da corsa.For more information, see Determining racing wheel capabilities.

Force feedbackForce feedback

Alcune ruote di Xbox One Racing offrono un vero — e proprio feedback forzato, che possono applicare le forze effettive su un asse di controllo, ad esempio la rotellina di sterzatura, — non solo una semplice vibrazione.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. I giochi usano questa funzionalità per creare un senso più approfondito dell'immersione (_danni anomali per l'arresto anomalo_del sistema, "strada") e per aumentare la sfida di guida.Games use this ability to create a greater sense of immersion (simulated crash damage, "road feel") and to increase the challenge of driving well.

Per altre informazioni, vedi Panoramica di force feedback.For more information, see Force feedback overview.

Spostamento interfaccia utenteUI navigation

Per semplificare il carico rappresentato dal supporto di dispositivi di input diversi per lo spostamento interfaccia utente e per aumentare la coerenza tra giochi e dispositivi, la maggior parte di dispositivi di input fisici funzionano simultaneamente come dispositivi di input logici separati denominati controller di spostamento interfaccia utente.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. Il controller di spostamento interfaccia utente fornisce un vocabolario comune per i comandi di spostamento interfaccia utente ai dispositivi di input.The UI navigation controller provides a common vocabulary for UI navigation commands across input devices.

Grazie alla loro particolare attenzione ai controlli analoghi e al grado di variazione tra le diverse ruote da corsa, sono in genere dotati di un Digital D-Pad, Visualizza, menu, a, B, Xe Y pulsanti simili a quelli di un Gamepad; questi pulsanti non sono progettati per supportare i comandi di gioco e non possono essere facilmente accessibili come pulsanti della rotella Racing.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.

Come controller di spostamento dell'interfaccia utente, Racing Wheels mappa il set di comandi di navigazione necessario ai pulsanti LEFT levetta, 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 di navigazioneNavigation command Input volanti da corsaRacing wheel input
SuUp D-pad suD-pad up
GiùDown D-pad giùD-pad down
SinistraLeft D-pad sinistraD-pad left
DestraRight D-pad destraD-pad right
VisualizzazioneView Pulsante VisualizzaView button
MenuMenu Pulsante MenuMenu button
AccettaAccept Pulsante AA button
AnnullaCancel Pulsante BB button

Inoltre, alcuni volanti da corsa potrebbero mappare alcuni dei comandi di spostamento dell'insieme opzionale ad altri input supportati, ma le mappature dei comandi possono variare da dispositivo a dispositivo.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 il supporto anche di questi comandi, ma assicurati che questi comandi non siano essenziali per la navigazione nell'interfaccia del tuo gioco.Consider supporting these commands as well, but make sure that these commands are not essential to navigating your game's interface.

Comando di navigazioneNavigation command Input volanti da corsaRacing wheel input
PGSUPage Up variavaries
PGGIÙPage Down variavaries
Pagina sinistraPage Left variavaries
Pagina destraPage Right variavaries
Scorrimento verso l'altoScroll Up variavaries
Scorrimento verso il bassoScroll Down variavaries
Scorrimento verso sinistraScroll Left variavaries
Scorrimento verso destraScroll Right variavaries
Contesto 1Context 1 Pulsante X (in_genere_)X Button (commonly)
Contesto 2Context 2 Pulsante Y (in_genere_)Y Button (commonly)
Contesto 3Context 3 variavaries
Contesto 4Context 4 variavaries

Rilevare e monitorare i volanti da corsaDetect and track racing wheels

Il rilevamento e il rilevamento delle ruote da corsa funzionano esattamente come per i gamepad, tranne che con la classe RacingWheel anziché con la classe del 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. Per altre informazioni, vedere Gamepad e vibrazione .See Gamepad and vibration for more information.

Lettura del volante da corsaReading the racing wheel

Una volta identificate le ruote a cui si è interessati, si è pronti per raccogliere i dati di input.After you identify the racing wheels that you're interested in, you're ready to gather input from them. Tuttavia, diversamente da altri tipi di input, i volanti da corsa non comunicano modifiche dello stato generando eventi.However, unlike some other kinds of input that you might be used to, racing wheels don't communicate state-change by raising events. Al contrario, è necessario leggere regolarmente gli stati correnti eseguendone il polling .Instead, you take regular readings of their current states by polling them.

Polling del volante da corsaPolling the racing wheel

Il polling cattura un'istantanea del volante da corsa in un momento preciso nel tempo.Polling captures a snapshot of the racing wheel at a precise point in time. Questo approccio alla raccolta di input è una scelta ottimale per la maggior parte dei giochi, perché la logica viene in genere eseguita in un ciclo deterministico anziché essere basata sugli eventi. è anche più semplice interpretare i comandi di gioco dall'input raccolto tutti insieme in una sola volta rispetto a molti input singoli raccolti nel 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.

Eseguire il polling di una ruota da corsa chiamando GetCurrentReading; Questa funzione restituisce un RacingWheelReading che contiene lo stato della ruota da corsa.You poll a racing wheel by calling GetCurrentReading; this function returns a RacingWheelReading that contains the state of the racing wheel.

Nel seguente esempio viene eseguito il polling di un volante da corsa per rilevarne lo stato corrente.The following example polls a racing wheel for its current state.

auto racingwheel = myRacingWheels[0];

RacingWheelReading reading = racingwheel->GetCurrentReading();

Oltre allo stato del volante da corsa, ogni lettura include un timestamp che indica precisamente quando è stato recuperato lo stato.In addition to the racing wheel state, each reading includes a timestamp that indicates precisely when the state was retrieved. Il timestamp è utile per la relazione con la temporizzazione delle precedenti letture o con la temporizzazione della simulazione del gioco.The timestamp is useful for relating to the timing of previous readings or to the timing of the game simulation.

Determinare le funzionalità del volante da corsaDetermining racing wheel capabilities

Molti dei comandi dei volanti da corsa sono facoltativi o supportano diverse varianti anche in relazione ai comandi obbligatori, quindi devi determinare le funzionalità di ciascun volante da corsa singolarmente prima di poter elaborare l'input raccolto in ogni lettura del volante da corsa.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.

I comandi opzionali sono il freno a mano, la frizione e il cambio; puoi determinare se un volante da corsa collegato supporta questi comandi leggendo le proprietà HasHandbrake, HasClutch e HasPatternShifter del volante da corsa, rispettivamente.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. Il controllo è supportato se il valore della proprietà è true; in caso contrario, non è supportato.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
}

Inoltre, i comandi che possono variare sono il volante e il cambio.Additionally, the controls that may vary are the steering wheel and pattern shifter. Il volante può variare in relazione al grado di rotazione fisica effettivo supportato, mentre il cambio può variare in relazione al numero di marce supportate.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. Puoi determinare l'angolo di rotazione massimo supportato dal volante leggendo la proprietà MaxWheelAngle del volante da corsa; il suo valore è l'angolo fisico massimo supportato in gradi in senso orario (positivo), supportato anche in direzione antioraria (gradi negativi).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). È possibile determinare l'ingranaggio più grande che lo spostamento del pattern supporta leggendo la MaxPatternShifterGear proprietà della ruota da corsa. il valore è l'ingranaggio superiore supportato, incluso — , se il valore è 4, lo spostamento del pattern supporta gli indici inversi, neutri, primo, secondo, terzo e quarto.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;

Infine, alcuni volanti da corsa supportano il force feedback attraverso il volante.Finally, some racing wheels support force feedback through the steering wheel. Puoi determinare se un volante da corsa collegato supportare il force feedback leggendo la proprietà WheelMotor del volante.You can determine whether a connected racing wheel supports force feedback by reading the WheelMotor property of the racing wheel. Il feedback forzato è supportato se WheelMotor non è null; in caso contrario, non è supportato.Force feedback is supported if WheelMotor is not null; otherwise it's not supported.

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

Per informazioni su come usare la funzionalità del force feedback dei volanti da corsa che la supportano, vedi Panoramica di force feedback.For information on how to use the force feedback capability of racing wheels that support it, see Force feedback overview.

Lettura dei pulsantiReading the buttons

Ognuno dei pulsanti della rotellina Racing — le quattro direzioni del D-Pad, i pulsanti dell' ingranaggio e dei riduttori successivi e 16 pulsanti aggiuntivi — forniscono una lettura digitale che indica se è premuto (in basso) o rilasciato (su).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). Per una maggiore efficienza, le letture del pulsante non vengono rappresentate come singoli valori booleani, al contrario, vengono inclusi in un singolo campo di bit rappresentati dall'enumerazione 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

Le ruote Racing sono dotate di pulsanti aggiuntivi usati per la navigazione dell'interfaccia utente, ad esempio i pulsanti Visualizza e menu .Racing wheels are equipped with additional buttons used for UI navigation such as the View and Menu buttons. Questi pulsanti non fanno parte dell'enumerazione RacingWheelButtons e possono essere letti solo accedendo al volante da corsa come dispositivo di spostamento interfaccia utente.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. Per ulteriori informazioni, vedi Dispositivo di spostamento interfaccia utente.For more information, see UI Navigation Device.

I valori dei pulsanti vengono letti dalla proprietà Buttons della struttura RacingWheelReading.The button values are read from the Buttons property of the RacingWheelReading structure. Poiché questa proprietà è un campo di bit, viene usato un mascheramento bit per bit per isolare il valore del pulsante che ti interessa.Because this property is a bitfield, bitwise masking is used to isolate the value of the button that you're interested in. Il pulsante viene premuto (in basso) quando è impostato il bit corrispondente; in caso contrario, viene rilasciato (su).The button is pressed (down) when the corresponding bit is set; otherwise, it's released (up).

Nell'esempio seguente viene determinato quando viene premuto il pulsante Marcia successiva.The following example determines whether the Next Gear button is pressed.

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

Nell'esempio seguente viene determinato quando viene rilasciato il pulsante Marcia successiva.The following example determines whether the Next Gear button is released.

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

In alcuni casi può essere utile determinare quando un pulsante passa da premuto a rilasciato o rilasciato a premuto, se più pulsanti vengono premuti o rilasciati o se un set di pulsanti viene disposto in un determinato modo, ad alcuni non è stato — premuto.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. Per le informazioni su come rilevare tali condizioni, vedi Rilevare le transizioni del pulsante e Rilevare le disposizioni complesse del pulsante.For information on how to detect these conditions, see Detecting button transitions and Detecting complex button arrangements.

Lettura del volanteReading the wheel

Il volante è un comando obbligatorio che fornisce una lettura analogica tra -1,0 e +1,0.The steering wheel is a required control that provides an analog reading between -1.0 and +1.0. Un valore -1,0 corrisponde alla posizione più a sinistra del volante; un valore di +1,0 a quella più a destra.A value of -1.0 corresponds to the left-most wheel position; a value of +1.0 corresponds to the right-most position. Il valore del volante viene letto dalla proprietà Wheel della struttura 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.

Anche se le letture del volante corrispondono a vari gradi di rotazione fisica nel volante effettivo a seconda dell'intervallo di rotazione supportato dal volante da corsa fisico, generalmente le letture del volante non vengono ridimensionate; volanti che supportano gradi di rotazione maggiori assicurano una maggiore precisione.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.

Lettura di acceleratore e frenoReading the throttle and brake

La limitazione e il freno sono i controlli necessari, ognuno dei quali fornisce letture analogiche tra 0,0 (completamente rilasciate) e 1,0 (completamente premuto) rappresentate come valori a virgola mobile.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. Il valore del comando dell'acceleratore viene letto dalla proprietà Throttle della struttura RacingWheelReading; il valore del comando del freno viene letto dalla proprietà 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

Leggere freno a mano e frizioneReading the handbrake and clutch

Freno a mano e frizione sono comandi opzionali che forniscono letture analogiche tra 0,0 (completamente rilasciato) e 1,0 (completamente innestato) rappresentati come valori in virgola mobile.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. Il valore del comando del freno a mano viene letto dalla proprietà Handbrake della struttura RacingWheelReading; il valore del comando della frizione viene letto dalla proprietà 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
}

Leggere il cambioReading the pattern shifter

Il cambio è un comando opzionale che fornisce una lettura digitale tra -1 e MaxPatternShifterGear rappresentata come un valore intero con segno.The pattern shifter is an optional control that provides a digital reading between -1 and MaxPatternShifterGear represented as a signed integer value. Il valore-1 o 0 corrisponde rispettivamente agli ingranaggi invertiti e neutri ; i valori sempre più positivi corrispondono a maggiori Gear in futuro fino a MaxPatternShifterGearinclusi.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. Il valore dello spostamento dello schema viene letto dalla proprietà PatternShifterGear dello 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

Lo spostamento dello schema, dove supportato, esiste insieme ai pulsanti di ingranaggio precedenti e successivi che interessano anche l'attuale ingranaggio dell'auto del giocatore.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 semplice strategia per unificare questi input, in cui sono presenti entrambi, è ignorare lo spostamento del pattern (e la frizione) quando un giocatore sceglie una trasmissione automatica per la propria auto e ignorare i pulsanti dell' ingranaggio precedente e successivo quando un giocatore sceglie una trasmissione manuale per l'automobile solo se la loro rotellina è dotata di un controllo dello spostamento dello schema.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. Puoi implementare una strategia di unificazione diversa se questa non è adatta al gioco specifico.You can implement a different unification strategy if this isn't suitable for your game.

Eseguire l'esempio InputInterfacingRun the InputInterfacing sample

L'esempio InputInterfacingUWP (github) dimostra come utilizzare i volanti da corsa e i diversi tipi di dispositivi di input insieme e come si comportano queste unità come controller di spostamento interfaccia utente.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.

Panoramica di force feedbackForce feedback overview

Molte ruote da corsa hanno funzionalità di feedback forzato per offrire un'esperienza di guida più coinvolgente e impegnativa.Many racing wheels have force feedback capability to provide a more immersive and challenging driving experience. I volanti da corsa che supportano il force feedback sono generalmente dotati di un singolo motore che applica forza al volante da corsa lungo un unico asse, quello della rotazione 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. Il feedback forzato è supportato nelle app Windows 10 e Xbox One UWP dallo spazio dei nomi Windows. Gaming. input. ForceFeedback .Force feedback is supported in Windows 10 and Xbox One UWP apps by the Windows.Gaming.Input.ForceFeedback namespace.

Nota

Le API Force feedback sono in grado di supportare diversi assi di forza, ma nessuna ruota Xbox One Racing supporta attualmente un asse di feedback diverso da quello della rotazione della rotellina.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.

Usare il force feedbackUsing force feedback

Queste sezioni descrivono le basi di programmazione degli effetti di force feedback per i volanti da corsa per Xbox One.These sections describe the basics of programming force feedback effects for Xbox One racing wheels. Il feedback viene applicato usando degli effetti, caricati prima sul dispositivo di force feedback e che quindi possono essere avviati, messi in pausa, ripresi e interrotti in modo simile agli effetti sonori; tuttavia, è necessario prima determinare le funzionalità di feedback del volante da corsa.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.

Determinare le funzionalità di force feedbackDetermining force feedback capabilities

Puoi determinare se un volante da corsa collegato supportare il force feedback leggendo la proprietà WheelMotor del volante.You can determine whether a connected racing wheel supports force feedback by reading the WheelMotor property of the racing wheel. Il feedback forzato non è supportato se WheelMotor è null; in caso contrario, Force feedback è supportato ed è possibile continuare a determinare le funzionalità di feedback specifiche del motore, ad esempio gli assi che possono influire.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
    }
}

Caricare gli effetti di force feedbackLoading force feedback effects

Gli effetti di force feedback sono caricati sul dispositivo di feedback nel quale vengono "riprodotti" autonomamente in base al gioco.Force feedback effects are loaded onto the feedback device where they are "played" autonomously at the command of your game. Sono disponibili diversi effetti di base. gli effetti personalizzati possono essere creati tramite una classe che implementa l'interfaccia IForceFeedbackEffect .A number of basic effects are provided; custom effects can be created through a class that implements the IForceFeedbackEffect interface.

Classe effettoEffect class Descrizione dell'effettoEffect description
ConditionForceEffectConditionForceEffect Un effetto che applica forza variabile in risposta al sensore corrente all'interno del dispositivo.An effect that applies variable force in response to current sensor within the device.
ConstantForceEffectConstantForceEffect Un effetto che applica forza costante lungo un vettore.An effect that applies constant force along a vector.
PeriodicForceEffectPeriodicForceEffect Un effetto che applica forza variabile definita da una forma d'onda, lungo un vettore.An effect that applies variable force defined by a waveform, along a vector.
RampForceEffectRampForceEffect Un effetto che applica una forza crescente/decrescente linearmente lungo un vettore.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();

Usare gli effetti di force feedbackUsing force feedback effects

Una volta caricati, gli effetti possono essere tutti avviati, messi in pausa, ripresi e interrotti in modo sincrono chiamando le funzioni sulla proprietà WheelMotor del volante da corsa, oppure singolarmente chiamando le funzioni sull'effetto di feedback stesso.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. Tipicamente, dovrai caricare tutti gli effetti che desideri utilizzare sul dispositivo di feedback prima dell'inizio del gioco e quindi utilizzare le funzioni SetParameters rispettive per aggiornare gli effetti all'avanzare del gioco.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();
}

Infine, se necessario, puoi abilitare, disabilitare o resettare in modo asincrono tutto il sistema di force feedback su un volante di corsa specifico.Finally, you can asynchronously enable, disable, or reset the entire force feedback system on a particular racing wheel whenever you need.

Vedere ancheSee also