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 Xbox One-zertifizierte Flight-Sticks mit Windows.Gaming.Input.FlightStick 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 Flight-Sticks und deren Benutzer
- So erkennen Sie, dass ein Flugstick hinzugefügt oder entfernt wurde
- Eingaben von einem oder mehreren Flugsticks lesen
- Wie sich Flugsticks als Benutzeroberflächen-Navigationsgeräte verhalten
Überblick
Flugsticks sind Eingabegeräte für Spiele, die für die Wiedergabe des Gefühls von Flugsticks geschätzt werden, die in einem Flugzeug oder Raumschiffs-Cockpit zu finden wären. Sie sind das perfekte Eingabegerät für schnelle und genaue Steuerung des Fluges. Flight-Joysticks werden in Windows 10- oder Windows 11- und Xbox One-Apps über den Windows.Gaming.Input-Namespace unterstützt.
Xbox One-zertifizierte Flugsticks sind mit den folgenden Steuerelementen ausgestattet:
- Ein verdrehbarer analoger Joystick, der rollen, neigen und schwenken kann
- Analoge Drosselung
- Zwei Feuerknöpfe
- Ein 8-Wege-Digital-Hutschalter
- Schaltflächen und Menü anzeigen
Hinweis
Die Schaltflächen Ansicht und Menü werden verwendet, um die UI-Navigation zu unterstützen, nicht Spielbefehle, und können deshalb nicht einfach als Joystick-Tasten aufgerufen werden.
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, fungieren die meisten physischen Eingabegeräte gleichzeitig als separate logische Eingabegeräte, die UI-Navigationscontrollergenannt werden. Der Benutzeroberflächennavigationscontroller bietet ein allgemeines Vokabular für Benutzeroberflächennavigationsbefehle auf allen Eingabegeräten.
Als Benutzeroberflächen-Navigationscontroller ordnet ein Flugstick die erforderlichen Navigationsbefehle dem Joystick und den Ansichts-, Menü-, FirePrimary-und FireSecondary--Schaltflächen zu.
Navigationsbefehl | Flight Stick-Eingabe |
---|---|
Nach oben | Joystick nach oben |
Nach unten | Joystick nach unten |
Nach links | Joystick nach links |
Richtig | Joystick rechts |
Ansehen | Schaltfläche Ansicht |
Menü | Menüschaltfläche |
Akzeptieren | Schaltfläche FirePrimary |
Abbrechen | Schaltfläche FireSecondary |
Flugsticks ordnen keines der optionalen Satz von Navigationsbefehlen zu.
Erkennen und Nachverfolgen von Flugsticks
Das Erkennen und Nachverfolgen von Flugsticks funktioniert genau auf dieselbe Weise wie für Gamepads, mit Ausnahme der FlightStick Klasse anstelle der Gamepad Klasse. Weitere Informationen zu Gamepad und Vibration finden Sie unter.
Lesen des Flugsticks
Nachdem Sie den Gewünschten Flugstick identifiziert haben, können Sie Eingaben daraus sammeln. Anders als bei anderen Arten von Eingaben, an die Sie möglicherweise gewöhnt sind, kommunizieren Flight-Sticks jedoch Zustandsänderungen nicht durch das Auslösen von Ereignissen. Stattdessen führen Sie regelmäßige Messungen ihres aktuellen Zustands durch, indem Sie sie abfragen.
Abrufen des Flugsticks
Beim Abfragen wird eine Momentaufnahme des Flugsteuerknüppels zu einem genauen 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 aus vielen einzelnen Eingaben, die im Laufe der Zeit gesammelt wurden.
Sie rufen einen Flightstick ab, indem Sie FlightStick.GetCurrentReadingaufrufen. Diese Funktion gibt eine FlightStickReading zurück, die den Zustand des Flugsticks enthält.
Im folgenden Beispiel wird ein Flugstick nach seinem aktuellen Zustand abgefragt:
auto flightStick = myFlightSticks->GetAt(0);
FlightStickReading reading = flightStick->GetCurrentReading();
Zusätzlich zum Zustand des Flugsticks enthält jeder Lesevorgang 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.
Lesen der Joystick- und Schubhebeleingaben
Der Joystick bietet einen analogen Lesewert zwischen -1,0 und 1,0 in den X-, Y- und Z-Achsen (Rollen, Neigung und Schwenken). Für Rollbewegungen entspricht ein Wert von -1,0 der linken Joystickposition, während ein Wert von 1,0 der rechten Joystickposition entspricht. Bei Neigung entspricht ein Wert von -1,0 der untersten Joystickposition, während ein Wert von 1,0 der obersten Position entspricht. Beim Gieren entspricht ein Wert von -1,0 der gegen den Uhrzeigersinn verdrehten Position, während ein Wert von 1,0 der im Uhrzeigersinn verdrehten Position entspricht.
Bei allen Achsen beträgt der Wert etwa 0,0, wenn sich der Joystick in der Mittelposition befindet, aber es ist normal, dass der genaue Wert variieren kann, auch zwischen nachfolgenden Werten. Strategien zur Milderung dieser Variation werden weiter unten in diesem Abschnitt erläutert.
Der Wert des Rollens wird aus der FlightStickReading.Roll-Eigenschaft gelesen, der Wert der Neigung wird aus der FlightStickReading.Pitch-Eigenschaft gelesen, und der Wert des Gierens wird aus der FlightStickReading.Yaw-Eigenschaft gelesen.
// Each variable will contain a value between -1.0 and 1.0.
float roll = reading.Roll;
float pitch = reading.Pitch;
float yaw = reading.Yaw;
Beim Ablesen der Joystickwerte werden Sie feststellen, dass diese nicht zuverlässig einen neutralen Wert von 0,0 erzeugen, wenn sich der Joystick in der Mittelposition befindet. Stattdessen erzeugen sie bei jeder Bewegung und dem Zurückbewegen des Joysticks in die Mittelposition unterschiedliche Werte in der Nähe von 0,0. Um diese Variationen zu mindern, können Sie einen kleinen Totbereichimplementieren, bei dem es sich um einen Wertebereich in der Nähe der idealen Mittelposition handelt, der ignoriert wird.
Eine Möglichkeit zur Implementierung einer Totzone besteht darin, zu bestimmen, wie weit der Joystick von der Mitte bewegt wurde, und Messwerte, die näher sind als eine von Ihnen gewählte Distanz, zu ignorieren. Sie können den Abstand ungefähr berechnen – es ist nicht genau, da Joystickwerte im Wesentlichen polar und nicht planar sind – nur mithilfe des Satzes des Pythagoras. Dies erzeugt eine radiale tote Zone.
Das folgende Beispiel veranschaulicht eine einfache radiale Totzone mit dem Satz des Pythagoras.
// Choose a deadzone. Readings inside this radius are ignored.
const float deadzoneRadius = 0.1f;
const float deadzoneSquared = deadzoneRadius * deadzoneRadius;
// Pythagorean theorem: For a right triangle, hypotenuse^2 = (opposite side)^2 + (adjacent side)^2
float oppositeSquared = pitch * pitch;
float adjacentSquared = roll * roll;
// Accept and process input if true; otherwise, reject and ignore it.
if ((oppositeSquared + adjacentSquared) < deadzoneSquared)
{
// Input accepted, process it.
}
Erfassen der Schaltflächen und des Hutschalters
Jeder der beiden Feuertasten des Flugsticks stellt einen digitalen Lesewert bereit, der angibt, ob er gedrückt (unten) oder losgelassen (nach oben) ist. Aus Effizienzgründen werden Schaltflächenwerte nicht als einzelne boolesche Werte dargestellt. Stattdessen werden sie alle in ein einzelnes Bitfeld gepackt, das durch die FlightStickButtons Enumeration dargestellt wird. Darüber hinaus bietet der 8-Wege-Hutschalter eine Richtung, die in einem einzelnen Bitfeld verpackt ist und durch die Enumeration GameControllerSwitchPosition dargestellt wird.
Hinweis
Flugsticks sind mit zusätzlichen Schaltflächen ausgestattet, die für die UI-Navigation verwendet werden, wie die Schaltflächen Ansicht und Menü. Diese Tasten sind nicht Teil der FlightStickButtons
-Aufzählung und können nur gelesen werden, indem auf den Flight-Stick als Benutzeroberflächennavigationsgerät zugegriffen wird. Weitere Informationen finden Sie im UI-Navigationscontroller.
Die Schaltflächenwerte werden aus der FlightStickReading.Buttons-Eigenschaft 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 FirePrimary gedrückt wird:
if (FlightStickButtons::FirePrimary == (reading.Buttons & FlightStickButtons::FirePrimary))
{
// FirePrimary is pressed.
}
Im folgenden Beispiel wird ermittelt, ob die Schaltfläche FirePrimary losgelassen wird:
if (FlightStickButtons::None == (reading.Buttons & FlightStickButtons::FirePrimary))
{
// FirePrimary 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 jeder dieser Bedingungen finden Sie unter Erkennen von Tastenübergängen und Erkennen komplexer Tastenanordnungen.
Der Hat switch-Wert wird aus der eigenschaft FlightStickReading.HatSwitch gelesen. Da diese Eigenschaft auch ein Bitfeld ist, wird die bitweise Maskierung erneut verwendet, um die Position des Hutschalters zu isolieren.
Im folgenden Beispiel wird ermittelt, ob sich der Hutschalter in der Aufwärtsposition befindet:
if (GameControllerSwitchPosition::Up == (reading.HatSwitch & GameControllerSwitchPosition::Up))
{
// The hat switch is in the up position.
}
Im folgenden Beispiel wird ermittelt, ob sich der Hutschalter in der Mittelposition befindet:
if (GameControllerSwitchPosition::Center == (reading.HatSwitch & GameControllerSwitchPosition::Center))
{
// The hat switch is in the center position.
}