Freigeben über


Steuerknüppel

Auf dieser Seite werden die Grundlagen der Programmierung für Xbox One-zertifizierte Flight-Joysticks mit Windows.Gaming.Input.FlightStick und verwandten APIs für die universelle Windows-Plattform (UWP) beschrieben.

Auf dieser Seite erhalten Sie Informationen zu folgenden Vorgängen:

  • Sammeln einer Liste der verbundenen Flight-Joysticks und deren Benutzer
  • Erkennen, dass ein Flight-Joystick hinzugefügt oder entfernt wurde
  • Lesen von Eingaben aus einem oder mehreren Flight-Joysticks
  • Verhalten von Flight-Joysticks als UI-Navigationsgeräte

Überblick

Flight-Joysticks sind Eingabegeräte für Spiele, die das Gefühl von Steuerknüppeln aus dem Cockpit eines Flugzeugs oder Raumschiffs nachahmen sollen. Sie sind das perfekte Eingabegerät für schnelle und genaue Steuerung eines Flugs. Flight-Joysticks werden in Windows 10- oder Windows 11- und Xbox One-Apps über den Windows.Gaming.Input-Namespace unterstützt.

Xbox One-zertifizierte Flight-Joysticks sind mit den folgenden Steuerelementen ausgestattet:

  • Ein drehbarer analoger Joystick, der rollen, neigen und schwenken kann
  • Eine analoge Drosselung
  • Zwei Feuertasten
  • Ein digitaler 8-Wege-Mehrwegeschalter
  • Tasten Ansicht und Menü

Hinweis

Die Tasten Ansicht und Menü werden verwendet, um die Benutzeroberflächennavigation zu unterstützen, keine Spielbefehle. Sie können daher nicht einfach als Joysticktasten aufgerufen werden.

Navigation in der Benutzeroberfläche

Um den Aufwand für die Unterstützung unterschiedlicher Eingabegeräte für die Benutzeroberflächennavigation zu verringern und die Konsistenz zwischen Spielen und Geräten zu fördern, dienen die meisten physischen Eingabegeräte gleichzeitig als getrennte logische Eingabegeräte, die als Benutzeroberflächen-Navigationscontroller bezeichnet werden. Der Navigationscontroller für die Benutzeroberflächen bietet ein gängiges Vokabular für Benutzeroberflächen-Navigationsbefehle auf allen Eingabegeräten.

Als Benutzeroberflächen-Navigationscontroller ordnet ein Flight-Joystick die erforderlichen Navigationsbefehle dem Joystick und den Tasten Ansicht, Menü, FirePrimary und FireSecondary zu.

Navigationsbefehl Flight-Joystick-Eingabe
Up Joystick nach oben
Nach unten Joystick nach unten
Nach links Joystick nach links
Right Joystick nach rechts
Sicht Ansicht-Taste
Menü Menü-Taste
Annehmen FirePrimary-Taste
Abbrechen FireSecondary-Taste

Flight-Joysticks ordnen keine der optionalen Sätze an Navigationsbefehlen zu.

Erkennen und Nachverfolgen von Flight-Joysticks

Das Erkennen und Nachverfolgen von Flight-Joysticks funktioniert genauso wie für Gamepads, mit Ausnahme der FlightStick-Klasse anstelle der Gamepad-Klasse. Weitere Informationen finden Sie unter Gamepad und Vibration.

Lesen des Flight-Joysticks

Nachdem Sie den gewünschten Flight-Joysticks identifiziert haben, können Sie Eingaben daraus sammeln. Anders als im Fall anderer Eingaben, die Sie möglicherweise kennen, teilen Flight-Joysticks Zustandsänderungen jedoch nicht durch das Auslösen von Ereignissen mit. Stattdessen müssen Sie den aktuellen Status regelmäßig auslesen, indem Sie ihn abrufen.

Abrufen des Flight-Joysticks

Beim Abrufen wird eine Momentaufnahme des Flight-Joysticks 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 von Eingaben, die alle gleichzeitig gesammelt wurden, zu interpretieren, als aus vielen einzelnen Eingaben, die im Laufe der Zeit gesammelt wurden.

Sie rufen einen Flight-Joystick ab, indem Sie FlightStick.GetCurrentReading aufrufen. Diese Funktion gibt ein FlightStickReading zurück, das den Status des Flight-Joystick enthält.

Im folgenden Beispiel wird der aktuelle Status eines Flight-Joysticks abgerufen:

auto flightStick = myFlightSticks->GetAt(0);
FlightStickReading reading = flightStick->GetCurrentReading();

Zusätzlich zum Status des Flight-Joysticks enthält jeder Lesevorgang einen Zeitstempel, der genau angibt, wann der Zustand abgerufen wurde. Der Zeitstempel ist nützlich, um sich auf die Anzeigedauer früherer Messwerte oder auf die Anzeigedauer der Spielsimulation zu beziehen.

Lesen des Flight-Joysticks und der Drosselungseingabe

Der Joystick bietet einen analogen Lesewert zwischen -1,0 und 1,0 in den X-, Y- und Z-Achsen (Rollen, Neigung und Schwenken). Beim Rollen entspricht der Wert -1,0 der äußersten linken Joystickposition, während der Wert 1,0 der äußersten rechten Position entspricht. Beim Neigen entspricht der Wert -1,0 der niedrigsten Joystickposition und der Wert +1,0 der höchsten Position. Beim Schwenken entspricht der Wert -1,0 der am meisten gegen den Uhrzeigersinn gedrehten Position, während der Wert 1,0 der am meisten im Uhrzeigersinn gedrehten 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 variiert, auch zwischen aufeinander folgenden Messungen. Strategien zur Milderung dieser Variation werden weiter unten in diesem Abschnitt erläutert.

Der Wert der Joystickrolle wird aus der Eigenschaft FlightStickReading.Roll gelesen, der Wert der Neigung wird aus der Eigenschaft FlightStickReading.Pitch gelesen, und der Wert des Schwenkens wird aus der Eigenschaft FlightStickReading.Yaw 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;

Sie werden feststellen, dass die ausgelesenen Joystickwerte nicht zuverlässig einen neutralen 0,0-Wert liefern, wenn sich der Joystick in der Mittelstellung (und damit im Ruhezustand) befindet. Stattdessen erhalten Sie verschiedene Näherungswerte für 0,0, wann immer der Joysticks bewegt wurde und wieder in die Mittelstellung zurückkehrt. Zur Abmilderung dieser Variationen können Sie einen kleinen inaktiven Bereich implementieren, bei dem es sich um einen Wertebereich in der Nähe der idealen Mittelposition handelt, der ignoriert wird.

Zur Implementierung eines inaktiven Bereichs können Sie beispielsweise ermitteln, wie weit sich der Joystick von der Mittelposition entfernt hat, und dabei die Werte ignorieren, die eine bestimmte, von Ihnen gewählte Entfernung unterschreiten. Die grobe Entfernung kann mit dem Satz des Pythagoras berechnet werden. (Die Berechnung ist nicht exakt, da die Joystickwerte im Grunde polarer und nicht planarer Natur sind.) Dies erzeugt einen radialen inaktiven Bereich.

Das folgende Beispiel veranschaulicht einen einfachen radialen inaktiven Bereich unter Verwendung des Satzes 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.
}

Lesen der Tasten und des Mehrwegeschalters

Jede der beiden Feuertasten des Flight-Joysticks stellt einen digitalen Lesewert bereit, der angibt, ob er gedrückt (unten) oder losgelassen (oben) ist. Aus Effizienzgründen werden die Ablesewerte der Tasten nicht als einzelne boolesche Werte dargestellt, sondern in einem einzelnen Bitfeld zusammengefasst, das durch die Enumeration FlightStickButtons dargestellt wird. Darüber hinaus bietet der 8-Wege-Mehrwegeschalter eine Richtung, die in einem einzelnen Bitfeld zusammengefasst ist, das durch die Enumeration GameControllerSwitchPosition dargestellt wird.

Hinweis

Flight-Joysticks sind mit zusätzlichen Tasten ausgestattet, die für die Benutzeroberflächennavigation verwendet werden, z. B. die Tasten Ansicht und Menü. Diese Tasten sind nicht Teil der FlightStickButtons-Enumeration und können nur gelesen werden, indem sie auf den Flight-Joystick als Benutzeroberflächen-Navigationsgerät zugreifen. Weitere Informationen finden Sie unter Benutzeroberflächen-Navigationscontroller.

Die Tastenwerte werden aus der Eigenschaft FlightStickReading.Buttons gelesen. Da diese Eigenschaft ein Bitfeld ist, wird die bitweise Maskierung verwendet, um den Wert der Taste zu isolieren, an der Sie interessiert sind. Die Taste wird gedrückt (unten), wenn das entsprechende Bit festgelegt ist; andernfalls wird sie freigegeben (oben).

Im folgenden Beispiel wird ermittelt, ob die Taste FirePrimary gedrückt ist:

if (FlightStickButtons::FirePrimary == (reading.Buttons & FlightStickButtons::FirePrimary))
{
    // FirePrimary is pressed.
}

Im folgenden Beispiel wird ermittelt, ob die Taste FirePrimary losgelassen wird:

if (FlightStickButtons::None == (reading.Buttons & FlightStickButtons::FirePrimary))
{
    // FirePrimary is released (not pressed).
}

Manchmal möchten Sie vielleicht bestimmen, wann eine Taste von gedrückter Taste in losgelassen übergeht oder losgelassen wird, ob mehrere Tasten gedrückt oder losgelassen werden, oder ob eine Reihe von Tasten auf eine bestimmte Weise angeordnet sind, einige gedrückt und andere nicht. Informationen zum Erkennen jeder dieser Bedingungen finden Sie unter Erkennen von Tastenübergängen und Erkennen komplexer Tastenanordnungen.

Der Mehrwegeschalterwert wird aus der Eigenschaft FlightStickReading.HatSwitch gelesen. Da diese Eigenschaft auch ein Bitfeld ist, wird die Bitmaske erneut verwendet, um die Position des Mehrwegeschalters zu isolieren.

Im folgenden Beispiel wird ermittelt, ob sich der Mehrwegeschalter 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 Mehrwegeschalter in der Mittelposition befindet:

if (GameControllerSwitchPosition::Center == (reading.HatSwitch & GameControllerSwitchPosition::Center))
{
    // The hat switch is in the center position.
}

Siehe auch