Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Auf dieser Seite werden die Grundlagen der Programmierung für Rennlenkräder auf Xbox One mit Windows.Gaming.Input.RacingWheel und verwandten APIs für die universelle Windows-Plattform (UWP) beschrieben.
Wenn Sie diese Seite lesen, lernen Sie Folgendes:
- So sammeln Sie eine Liste der verbundenen Rennlenkräder und deren Benutzer
- Wie man erkennt, dass ein Rennlenkrad hinzugefügt oder entfernt wurde
- Wie man Eingaben von einem oder mehreren Rennlenkrädern liest
- Wie man Kraftrückmeldungsbefehle sendet
- Verhalten von Rennlenkrädern als Benutzeroberflächennavigationsgeräte
Übersicht über Rennlenkräder
Rennlenkräder sind Eingabegeräte, die dem Gefühl eines echten Rennwagen-Cockpits ähneln. Rennlenkräder sind das perfekte Eingabegerät sowohl für Rennspiele im Arcade-Stil als auch für Rennspiele im Simulationsstil, die Autos oder Trucks enthalten. Rennlenkräder werden in UWP-Apps für Windows 10, Windows 11 und Xbox One vom Windows.Gaming.Input-Namespace unterstützt.
Rennlenkräder werden zu unterschiedlichen Preispunkten angeboten, wobei sie in der Regel mehr und bessere Eingabe- und Kraftrückmeldungsfunktionen bieten, je höher ihre Preispunkte sind. Alle Rennlenkräder sind mit analogen Gaspedal- und Bremssteuerungen sowie einigen am Rad befindlichen Tasten ausgestattet. Einige Rennlenkräder sind zusätzlich mit analogen Kupplungs- und Handbremssteuerungen, Musterschaltungen und Kraftrückmeldungsfunktionen ausgestattet. Nicht alle Rennlenkräder sind mit den gleichen Funktionen ausgestattet und können auch in ihrer Unterstützung für bestimmte Merkmale variieren. So können Lenkräder beispielsweise unterschiedliche Drehbereiche bieten, und Gangschaltungen können unterschiedliche Anzahlen von Gängen unterstützen.
Gerätefunktionen
Verschiedene Rennlenkräder bieten unterschiedliche Gruppen optionaler Gerätefunktionen und unterschiedliche Unterstützungsebenen für diese Funktionen; Diese Variationsebene zwischen einer einzelnen Art von Eingabegerät ist unter den Geräten eindeutig, die von der Windows.Gaming.Input-API unterstützt werden. Darüber hinaus unterstützen die meisten Geräte, auf die Sie stoßen, mindestens einige optionale Fähigkeiten oder andere Variationen. Aus diesem Grund ist es wichtig, die Funktionen jedes verbundenen Rennlenkrads einzeln zu bestimmen und die volle Variation der Funktionen zu unterstützen, die für Ihr Spiel sinnvoll sind.
Weitere Informationen finden Sie unter Bestimmung der Fähigkeiten von Rennlenkrädern.
Kraftrückmeldung
Einige Rennlenkräder bieten echte Kraftrückmeldung , d. h., sie können tatsächliche Kräfte auf einer Steuerachse wie ihrem Lenkrad anwenden – nicht nur einfache Vibrationen. Spiele nutzen diese Fähigkeit, ein größeres Gefühl der Immersion zu schaffen (simulierte Absturzschäden, "Straßengefühl") und die Herausforderung des Fahrens gut zu erhöhen.
Weitere Informationen finden Sie unter Force feedback overview.
UI-Navigation
Um die Unterstützung der verschiedenen Eingabegeräte für die Benutzeroberflächennavigation zu erleichtern und die Konsistenz zwischen Spielen und Geräten zu fördern, dienen die meisten physischen Eingabegeräte gleichzeitig als separates logisches Eingabegerät, das als UI-Navigationscontroller bezeichnet wird,. Der Benutzeroberflächennavigationscontroller bietet ein allgemeines Vokabular für Benutzeroberflächennavigationsbefehle auf allen Eingabegeräten.
Aufgrund ihres einzigartigen Fokus auf analoge Steuerelemente und des Grads der Variation zwischen verschiedenen Rennlenkrädern sind sie in der Regel mit einem digitalen D-Pad, Ansicht, Menü, A, B, Xund Y Tasten ausgestattet, die denen eines Gamepadsähneln. Diese Schaltflächen sind nicht dazu gedacht, Spielbefehle zu unterstützen, und können nicht leicht als Tasten von Rennlenkrädern verwendet werden.
Als Benutzeroberflächen-Navigationscontroller ordnen Rennlenkräder den erforderlichen von Navigationsbefehlen auf den linken Ministick, das Steuerkreuz, Ansicht, Menü, Aund B Schaltflächen zu.
Navigationsbefehl | Rennlenker-Eingabe |
---|---|
Nach oben | Steuerkreuz nach oben |
Nach unten | Steuerkreuz nach unten |
Nach links | D-Pad nach links |
Richtig | Steuerkreuz rechts |
Ansehen | Schaltfläche "Ansicht" |
Menü | Menüschaltfläche |
Akzeptieren | Eine Schaltfläche |
Abbrechen | B-Schaltfläche |
Darüber hinaus können einige Rennlenkräder einige der optionalen Navigationsbefehle anderen unterstützten Eingaben zuordnen, aber die Zuordnung von Befehlen kann von Gerät zu Gerät variieren. Erwägen Sie auch die Unterstützung dieser Befehle, stellen Sie jedoch sicher, dass diese Befehle für die Navigation in der Benutzeroberfläche Ihres Spiels nicht unbedingt erforderlich sind.
Navigationsbefehl | Rennlenker-Eingabe |
---|---|
Bild nach oben bewegen | variiert |
Bild ab | variiert |
Linke Seite | variiert |
Seite rechts | variiert |
Nach oben scrollen | variiert |
Nach unten scrollen | variiert |
Nach links scrollen | variiert |
Nach rechts scrollen | variiert |
Kontext 1 | X-Schaltfläche (häufig) |
Kontext 2 | Y-Taste (häufig) |
Kontext 3 | variiert |
Kontext 4 | variiert |
Erkennung und Nachverfolgung von Rennlenkrädern
Das Erkennen und Verfolgen von Rennlenkrädern funktioniert genau so wie bei Gamepads, jedoch mit der RacingWheel Klasse anstelle der Gamepad Klasse. Weitere Informationen zu Gamepad und Vibration finden Sie unter.
Lesen des Rennlenkrads
Nachdem Sie die Rennlenkräder identifiziert haben, an denen Sie interessiert sind, können Sie Rückmeldungen von ihnen einholen. Jedoch kommunizieren Rennlenkräder, im Gegensatz zu einigen anderen Eingabearten, an die Sie möglicherweise gewöhnt sind, eine Zustandsänderung nicht durch das Auslösen von Ereignissen. Stattdessen nehmen Sie regelmäßige Lesungen ihrer aktuellen Zustände durch Abfragen.
Abrufen des Rennlenkrads
Durch die Abfrage wird eine Momentaufnahme des Rennlenkrads zu einem präzisen Zeitpunkt erfasst. Dieser Ansatz zum Sammeln von Eingaben eignet sich gut für die meisten Spiele, da ihre Logik in der Regel in einer deterministischen Schleife ausgeführt wird, anstatt ereignisgesteuert zu sein; Es ist in der Regel auch einfacher, Spielbefehle aus eingaben zu interpretieren, die alle gleichzeitig gesammelt wurden, als es aus vielen einzelnen Eingaben stammt, die im Laufe der Zeit gesammelt wurden.
Sie fragen ein Rennlenkrad ab, indem Sie GetCurrentReadingaufrufen; diese Funktion gibt ein RacingWheelReading--Objekt zurück, das den Zustand des Rennlenkrads enthält.
Im folgenden Beispiel wird der aktuelle Zustand eines Rennlenkrads abgefragt.
auto racingwheel = myRacingWheels[0];
RacingWheelReading reading = racingwheel->GetCurrentReading();
Zusätzlich zum Rennlenkradzustand enthält jeder Wert einen Zeitstempel, der genau angibt, wann der Zustand abgerufen wurde. Der Zeitstempel ist nützlich, um sich auf den Zeitpunkt früherer Messungen oder den Zeitpunkt der Spielsimulation zu beziehen.
Bestimmung der Fähigkeiten des Rennlenkrads
Viele der Steuerungen der Rennlenkräder sind optional oder unterstützen unterschiedliche Variationen auch innerhalb der erforderlichen Steuerungen, sodass Sie die Fähigkeiten jedes Rennlenkrads individuell bestimmen müssen, bevor Sie die gesammelten Eingaben bei jeder Erfassung der Rennlenkräder verarbeiten können.
Die optionalen Steuerelemente sind die Handbremse, Kupplung und das Schaltschema; Sie können feststellen, ob ein verbundenes Rennlenkrad diese Steuerelemente unterstützt, indem Sie die Eigenschaften HasHandbrake, HasClutchund HasPatternShifter des Rennlenkrads lesen. Das Steuerelement wird unterstützt, wenn der Wert der Eigenschaft trueist; andernfalls wird sie nicht unterstützt.
if (racingwheel->HasHandbrake)
{
// the handbrake is supported
}
if (racingwheel->HasClutch)
{
// the clutch is supported
}
if (racingwheel->HasPatternShifter)
{
// the pattern shifter is supported
}
Darüber hinaus sind die Steuerelemente, die variieren können, das Lenkrad und die Gangschaltung. Das Lenkrad kann je nach Grad der physischen Drehung variieren, die das eigentliche Rad unterstützen kann, während die Gangschaltung je nach Anzahl unterschiedlicher Vorwärtsgänge variieren kann, die es unterstützt. Sie können den größten Drehwinkel bestimmen, den das Rad tatsächlich unterstützt, indem Sie die MaxWheelAngle
-Eigenschaft des Rennlenkrads lesen. Ihr Wert ist der maximal unterstützte physische Winkel in Grad im Uhrzeigersinn (positiv), der ebenfalls im Gegenuhrzeigersinn (negative Grad) unterstützt wird. Sie können den höchsten Vorwärtsgang bestimmen, den die Musterschaltung unterstützt, indem Sie die MaxPatternShifterGear
Eigenschaft des Rennlenkrads lesen; Ihr Wert ist der höchste Vorwärtsgang einschließlich des höchsten unterstützten Vorwärtsgangs, d. h., wenn der Wert 4 ist, unterstützt der Musterschaltung Rückwärtsgang, Leerlauf, erster, zweiter, dritter und vierter Gang.
auto maxWheelDegrees = racingwheel->MaxWheelAngle;
auto maxShifterGears = racingwheel->MaxPatternShifterGear;
Schließlich unterstützen einige Rennlenkräder Kraftrückmeldung durch das Lenkrad. Sie können ermitteln, ob ein angeschlossenes Rennlenkrad die Kraftrückmeldung unterstützt, indem Sie die WheelMotor Eigenschaft des Rennlenkrads lesen. Kraftrückmeldung wird unterstützt, wenn WheelMotor
nicht nullist; andernfalls wird sie nicht unterstützt.
if (racingwheel->WheelMotor != nullptr)
{
// force feedback is supported
}
Informationen zur Verwendung der Kraftrückmeldungsfunktion von Rennlenkrädern, die sie unterstützen, finden Sie unter Übersicht über Kraftfeedback.
Lesen der Schaltflächen
Jede der Rennlenkradtasten – die vier Richtungen des Steuerkreuzes, die Vorheriger Gang und Nächster Gang Tasten und 16 zusätzliche Tasten – bietet einen digitalen Lesewert, der angibt, ob sie gedrückt (unten) oder losgelassen (oben) ist. Aus Effizienzgründen werden Tastenlesungen nicht als einzelne boolesche Werte dargestellt; stattdessen sind sie alle in ein einzelnes Bitfeld gepackt, das durch die RacingWheelButtons Aufzählung dargestellt wird.
Hinweis
Rennlenkräder sind mit zusätzlichen Tasten ausgestattet, die für die Navigation der Benutzeroberfläche verwendet werden, wie die Tasten Ansicht und Menü. Diese Tasten sind nicht Teil der RacingWheelButtons
-Enumeration und können nur gelesen werden, indem das Rennlenkrad als Benutzeroberflächennavigationsgerät angesprochen wird. Weitere Informationen finden Sie unter UI-Navigationsgerät.
Die Schaltflächenwerte werden aus der Buttons
-Eigenschaft der RacingWheelReading- Struktur gelesen. Da diese Eigenschaft ein Bitfeld ist, wird die bitweise Maskierung verwendet, um den Wert der Schaltfläche zu isolieren, an der Sie interessiert sind. Die Taste wird gedrückt (nach unten), wenn das entsprechende Bit festgelegt ist; andernfalls wird sie losgelassen (nach oben).
Im folgenden Beispiel wird ermittelt, ob die Schaltfläche "Nächster Gang" gedrückt wird.
if (RacingWheelButtons::NextGear == (reading.Buttons & RacingWheelButtons::NextGear))
{
// Next Gear is pressed
}
Im folgenden Beispiel wird ermittelt, ob die Schaltfläche "Nächster Schritt" losgelassen wird.
if (RacingWheelButtons::None == (reading.Buttons & RacingWheelButtons::NextGear))
{
// Next Gear is released (not pressed)
}
Manchmal möchten Sie vielleicht ermitteln, wann eine Taste von gedrückt zu losgelassen oder von losgelassen zu gedrückt wechselt, ob mehrere Tasten gedrückt oder losgelassen sind oder ob eine Reihe von Tasten auf eine bestimmte Weise angeordnet ist – einige sind gedrückt, andere nicht. Informationen zum Erkennen dieser Bedingungen finden Sie unter Erkennen von Tastenübergängen und Erkennen komplexer Tastenanordnungen.
Das Rad lesen
Das Lenkrad ist ein erforderliches Steuerelement, das einen analogen Lesewert zwischen -1,0 und +1,0 bereitstellt. Ein Wert von -1,0 entspricht der linkesten Radposition; ein Wert von +1,0 entspricht der rechten Randposition. Der Wert des Lenkrads wird aus der Wheel
-Eigenschaft der -RacingWheelReading--Struktur gelesen.
float wheel = reading.Wheel; // returns a value between -1.0 and +1.0.
Obwohl Radmesswerte unterschiedlichen Graden der physischen Drehung im tatsächlichen Rad entsprechen, je nach Drehbereich, den das physische Rennlenkrad unterstützt, möchten Sie die Radmesswerte in der Regel nicht skalieren; Räder, die größere Grade der Drehung unterstützen, bieten einfach eine höhere Präzision.
Ablesen von Gas- und Bremspedal
Die Drosselung und Bremse sind erforderliche Steuerelemente, die jeweils analoge Werte zwischen 0,0 (vollständig losgelassen) und 1,0 (vollständig gedrückt) bereitstellen, die als Gleitkommawerte dargestellt werden. Der Wert des Gaspedals wird aus der Eigenschaft Throttle
der RacingWheelReading Struktur gelesen; der Wert der Bremssteuerung wird aus der Eigenschaft Brake
gelesen.
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
Lesen der Handbremse und Kupplung
Die Handbremse und Kupplung sind optionale Steuerelemente, die jeweils analoge Werte zwischen 0,0 (vollständig losgelassen) und 1,0 (vollständig eingebunden) bereitstellen, die als Gleitkommawerte dargestellt werden. Der Wert des Handbrems-Steuerelements wird aus der Handbrake
-Eigenschaft der RacingWheelReading-Struktur gelesen; der Wert des Kupplungssteuerelements wird aus der Clutch
-Eigenschaft gelesen.
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
}
Lesen des Musterwechslers
Der Musterverschieber ist ein optionales Steuerelement, das einen digitalen Ablesewert zwischen -1 und MaxPatternShifterGear in Form eines signierten ganzzahligen Werts darstellt. Ein Wert von -1 oder 0 entspricht dem Rückwärts- bzw. Neutral--Gang; Mit zunehmenden positiven Werten entsprechen höheren Vorwärtsgängen bis einschließlich MaxPatternShifterGear. Der Wert der Musterverschiebung wird aus der PatternShifterGear-eigenschaft der RacingWheelReading--Struktur gelesen.
if (racingwheel->HasPatternShifter)
{
gear = reading.PatternShifterGear;
}
Hinweis
Die Gangschaltung, sofern unterstützt, ist neben den erforderlichen Previous Gear und Next Gear Tasten vorhanden, die sich auch auf den aktuellen Gang des Spielerwagens auswirken. Eine einfache Strategie zur Vereinheitlichung dieser Eingaben, bei denen beide vorhanden sind, besteht darin, die Musterschaltung (und die Kupplung) zu ignorieren, wenn ein Spieler ein automatisches Getriebe für sein Auto wählt, und die Vorheriger Gang und Nächster Gang Tasten zu ignorieren, wenn ein Spieler ein manuelles Getriebe für sein Auto wählt, sofern sein Rennlenkrad mit einer Gangmuster-Schaltsteuerung ausgestattet ist. Sie können eine andere Vereinheitlichungsstrategie implementieren, wenn dies nicht für Ihr Spiel geeignet ist.
Führen Sie das InputInterfacing-Beispiel aus
Die InputInterfacingUWP Beispiel-App auf GitHub veranschaulicht, wie Rennlenkräder und verschiedene Arten von Eingabegeräten zusammen verwendet werden und wie sich diese Eingabegeräte als Benutzeroberflächen-Navigationssteuerungen verhalten.
Übersicht über Force-Feedback
Viele Rennlenkräder verfügen über Kraftrückmeldungsfunktionen, um ein immersiveres und anspruchsvolleres Fahrerlebnis zu bieten. Rennlenkräder, die Kraftrückmeldung unterstützen, sind in der Regel mit einem einzigen Motor ausgestattet, der Kraft auf das Lenkrad entlang einer einzelnen Achse, der Achse der Raddrehung, anwendet. Kraftrückmeldung wird in Windows 10- oder Windows 11- und Xbox One-UWP-Apps über den Windows.Gaming.Input.ForceFeedback-Namespace unterstützt.
Hinweis
Die Kraftrückmeldungs-APIs sind in der Lage, mehrere Kraftachsen zu unterstützen, aber derzeit unterstützt kein Rennlenkrad eine andere Feedbackachse als die der Raddrehung.
Verwendung der Kraft-Rückmeldung
In diesen Abschnitten werden die Grundlagen der Programmierung von Kraftrückmeldungseffekten für Rennlenkräder beschrieben. Feedback wird mithilfe von Effekten angewendet, die zuerst auf das Kraftrückmeldungsgerät geladen werden und dann gestartet, angehalten, fortgesetzt und auf eine ähnliche Weise wie Soundeffekte beendet werden können; Sie müssen jedoch zuerst die Feedbackfunktionen des Rennlenkrads bestimmen.
Ermittlung der Kraftrückmeldungsfunktionen
Sie können ermitteln, ob ein angeschlossenes Rennlenkrad die Kraftrückmeldung unterstützt, indem Sie die WheelMotor Eigenschaft des Rennlenkrads lesen. Kraftrückmeldung wird nicht unterstützt, wenn WheelMotor
NULL-ist; andernfalls wird die Kraftrückmeldung unterstützt, und Sie können die spezifischen Rückmeldungsfähigkeiten des Motors ermitteln, z. B. die Achsen, auf die er wirken kann.
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
}
}
Kraftrückmeldungseffekte werden geladen
Force-Feedback-Effekte werden auf das Force-Feedback-Gerät geladen, auf dem sie autonom auf Befehl Ihres Spiels "gespielt" werden. Es werden eine Reihe von grundlegenden Effekten bereitgestellt; Benutzerdefinierte Effekte können über eine Klasse erstellt werden, die die IForceFeedbackEffect Schnittstelle implementiert.
Effektklasse | Effektbeschreibung |
---|---|
BedingungsKraftEffekt | Ein Effekt, der variable Kraft als Reaktion auf den Stromsensor im Gerät anwendet. |
Konstante Kraftwirkung | Ein Effekt, der konstante Kraft entlang eines Vektors anwendet. |
PeriodischeKraftEffekt | Ein Effekt, der variable Kraft anwendet, die durch eine Wellenform definiert ist, entlang eines Vektors. |
Rampenkrafteffekt | Ein Effekt, der eine linear steigende/abnehmende Kraft entlang eines Vektors anwendet. |
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();
Verwenden von Effekten der Kraftrückmeldung
Sobald die Effekte geladen sind, können sie alle synchron gestartet, angehalten, fortgesetzt und gestoppt werden, indem Funktionen für die WheelMotor
-Eigenschaft des Rennlenkrads aufgerufen werden, oder einzeln, indem Funktionen für den Feedback-Effekt selbst aufgerufen werden. In der Regel sollten Sie alle Effekte laden, die Sie auf dem Feedbackgerät verwenden möchten, bevor das Spiel beginnt, und dann die entsprechenden SetParameters
Funktionen verwenden, um die Effekte während des Spielfortschritts zu aktualisieren.
if (ForceFeedbackEffectState::Running == effect->State)
{
effect->Stop();
}
else
{
effect->Start();
}
Schließlich können Sie bei Bedarf das gesamte Kraftrückmeldungssystem auf einem bestimmten Rennlenkrad asynchron aktivieren, deaktivieren oder zurücksetzen.