Benutzeroberflächen-Navigationscontroller

Auf dieser Seite werden die Grundlagen der Programmierung für Benutzeroberflächennavigationsgeräte mit Windows.Gaming.Input.UINavigationController und zugehörigen APIs für die Universelle Windows-Plattform (UWP) beschrieben.

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

  • Erstellen einer Liste verbundener Benutzeroberflächen-Navigationsgeräte und deren Benutzer
  • Erkennen, dass ein Navigationsgerät hinzugefügt oder entfernt wurde
  • Lesen von Eingaben von einem oder mehreren Benutzeroberflächen-Navigationsgeräten
  • Verhalten von Gamepads und Arcade-Joysticks als Navigationsgeräte

Übersicht über Benutzeroberflächen-Navigationsgeräte

Fast alle Spiele verfügen neben dem Gameplay zumindest über etwas Benutzeroberfläche, auch wenn es sich dabei nur um Pregame-Menüs oder In-Game-Dialogfelder handelt. Die Spieler müssen auf dieser Benutzeroberfläche unabhängig vom gewählten Eingabegerät navigieren können. Daher müssen die Entwickler spezifische Unterstützung für alle Arten von Eingabegeräten hinzufügen und können so auch Inkonsistenzen zwischen Spielen und Eingabegeräten einführen, die die Spieler verwirren. Aus diesen Gründen wurde die UINavigationController-API erstellt.

Benutzeroberflächen-Navigationscontroller sind logische Eingabegeräte, die zur Bereitstellung eines Vokabulars gängiger Benutzeroberflächen-Navigationsbefehle dienen, die von einer Vielzahl von physischen Eingabegeräten unterstützt werden können. Ein Benutzeroberflächen-Navigationscontroller ist nur eine andere Betrachtungsweise für ein physisches Eingabegerät. Wir verwenden Navigationsgerät für alle physischen Eingabegeräte, die als Navigationscontroller betrachtet werden. Durch Programmieren für ein Navigationsgerät statt für bestimmte Eingabegeräte verhindern die Entwickler das Problem, verschiedene Eingabegeräte unterstützen zu müssen, und erzielen standardmäßig Konsistenz.

Da die Anzahl und Vielzahl der von jedem Typ von Eingabegeräten unterstützten Steuerelemente enorm variieren kann und da bestimmte Eingabegeräte möglicherweise einen umfangreicheren Satz von Navigationsbefehlen unterstützen, teilt die Navigationscontrollerschnittstelle das Vokabular der Befehle in einen erforderlichen Satz, der die gängigsten und wesentlichen Befehle enthält, und einen optionalen Satz ein, der praktische, aber nicht erforderliche Befehle enthält. Alle Navigationsgeräte unterstützen jeden Befehl im erforderlichen Satz und unterstützen möglicherweise alle, einige oder keine Befehle im optionalen Satz.

Erforderlicher Satz

Navigationsgeräte müssen alle Navigationsbefehle im erforderlichen Satz unterstützen. Dies sind die Richtungsbefehle (nach oben, unten, links und rechts), Ansicht, Menü, Akzeptieren und Abbrechen.

Die Richtungsbefehle sind für die primäre XY-Fokusnavigation zwischen einzelnen Benutzeroberflächenelementen vorgesehen. Die Ansichts- und Menübefehle dienen zum Anzeigen von (kurzzeitigen oder modalen) Informationen zum Gameplay und zum Wechseln zwischen Gameplay und Menü. Die Befehle „Akzeptieren“ und „Abbrechen“ sind für zustimmende (Ja) und ablehnende (Nein) Antworten vorgesehen.

In der folgenden Tabelle werden diese Befehle und ihre beabsichtigte Nutzung mit Beispielen zusammengefasst. | Befehl | Beabsichtigte Verwendung | -------:| --------------- | Nach oben | XY-Fokusnavigation nach oben | Nach unten | XY-Fokusnavigation nach unten | Links | XY-Fokusnavigation nach links | Rechts | XY-Fokusnavigation rechts | Ansicht | Anzeigen von Spielinformationen (Anzeigetafel, Spielstatistiken, Ziele, Welt- oder Gebietskarte) | Menü | Primäres Menü/Pause (Einstellungen, status, Ausrüstung, Bestand, Pause) | Akzeptieren | Positive Antwort (annehmen, voranschreiten, bestätigen, starten, ja) | Abbrechen | Negative Antwort (Ablehnen, Umkehren, Ablehnen, Beenden, Nein)

Optionaler Satz

Navigationsgeräte können alle, einige oder keine Navigationsbefehle im optionalen Satz unterstützen. Hierbei handelt es sich um Paging- (nach oben, unten, links und rechts), Bildlauf- (nach oben, unten, links und rechts) und Kontextbefehle (Kontext 1 bis 4).

Die Kontextbefehle sind explizit für anwendungsspezifische Befehle und Tastenkombinationen für die Navigation vorgesehen. Die Paging- und Bildlaufbefehle sind für die schnelle Navigation zwischen Seiten oder Gruppen von Benutzeroberflächenelementen und für die differenzierte Navigation innerhalb von Benutzeroberflächenelementen vorgesehen.

In der folgenden Tabelle werden diese Befehle und ihre beabsichtigte Nutzung zusammengefasst. | Befehl | Beabsichtigte Verwendung | -----------:| ------------ | PageUp | Nach oben springen (zur oberen/vorherigen vertikalen Seite oder Gruppe) | PageDown | Nach unten springen (zur unteren/nächsten vertikalen Seite oder Gruppe) | PageLeft | Nach links springen (nach links/vorherige horizontale Seite oder Gruppe) | PageRight | Nach rechts springen (nach rechts/nächste horizontale Seite oder Gruppe) | ScrollUp | Bildlauf nach oben (innerhalb eines fokussierten UI-Elements oder einer scrollbaren Gruppe) | ScrollDown | Scrollen Nach unten (innerhalb eines fokussierten UI-Elements oder einer scrollbaren Gruppe) | ScrollLeft | Scrollen nach links (innerhalb eines fokussierten UI-Elements oder einer scrollbaren Gruppe) | ScrollRight | Bildlauf nach rechts (innerhalb eines fokussierten UI-Elements oder einer scrollbaren Gruppe) | Context1 | Primäre Kontextaktion | Context2 | Sekundäre Kontextaktion | Context3 | Dritte Kontextaktion | Context4 | Vierte Kontextaktion

Hinweis Obwohl ein Spiel frei ist, auf jeden Befehl mit einer tatsächlichen Funktion zu reagieren, die sich von der beabsichtigten Verwendung unterscheidet, sollte überraschendes Verhalten vermieden werden. Ändern Sie insbesondere nicht die tatsächliche Funktion eines Befehls, wenn Sie dessen vorgesehene Nutzung benötigen. Weisen Sie neue Funktionen dem Befehl zu, bei dem es am sinnvollsten erscheint, und weisen Sie die gegenteiligen Funktionen gegenteiligen Befehlen zu, wie etwa BildAuf/BildAb. Überlegen Sie schließlich, welche Befehle von allen Eingabegeräten unterstützt werden und welche Steuerelemente ihnen zugeordnet sind, und stellen Sie dadurch sicher, dass kritische Befehle über jedes Gerät aufgerufen werden können.

Navigation per Gamepad, Arcade-Joystick und Rennlenkrad

Alle vom Windows.Gaming.Input-Namespace unterstützten Eingabegeräte sind Benutzeroberflächen-Navigationsgeräte.

Die folgende Tabelle fasst zusammen, wie der erforderliche Satz der Navigationsbefehle verschiedenen Eingabegeräten zugeordnet wird.

Navigationsbefehl Gamepad-Eingabe Eingabe per Arcade-Joystick Rennlenkrad-Eingabe
Nach oben Linker Ministick nach oben/Steuerkreuz nach oben Joystick nach oben Steuerkreuz nach oben
Nach unten Linker Ministick nach unten/Steuerkreuz nach unten Joystick nach unten Steuerkreuz nach unten
Links Linker Ministick nach links/Steuerkreuz nach links Joystick nach links Steuerkreuz nach links
Right Linker Ministick nach rechts/Steuerkreuz nach rechts Joystick nach rechts Steuerkreuz nach rechts
Sicht Ansicht-Taste Ansicht-Taste Ansicht-Taste
Menü Menü-Taste Menü-Taste Menü-Taste
Akzeptieren A-Taste Taste für Aktion 1 A-Taste
Abbrechen B-Taste Taste für Aktion 2 B-Taste

Die folgende Tabelle fasst zusammen, wie der optionale Satz der Navigationsbefehle verschiedenen Eingabegeräten zugeordnet wird.

Navigationsbefehl Gamepad-Eingabe Eingabe per Arcade-Joystick Rennlenkrad-Eingabe
BILD-AUF Linker Trigger nicht unterstützt variiert
BILD-AB Rechter Trigger nicht unterstützt variiert
PageLeft Linker Bumper nicht unterstützt variiert
PageRight Rechter Bumper nicht unterstützt variiert
ScrollUp Rechter Ministick nach oben nicht unterstützt variiert
ScrollDown Rechter Ministick nach unten nicht unterstützt variiert
ScrollLeft Rechter Ministick nach links nicht unterstützt variiert
ScrollRight Rechter Ministick nach rechts nicht unterstützt variiert
Context1 X-Taste nicht unterstützt X-Taste (gängig)
Context2 Y-Taste nicht unterstützt Schaltfläche "Y" (häufig)
Context3 Linken Ministick drücken nicht unterstützt variiert
Context4 Rechten Ministick drücken nicht unterstützt variiert

Benutzeroberflächen-Navigationscontroller erkennen und nachverfolgen

Auch wenn Benutzeroberflächen-Navigationscontroller logische Eingabegeräte sind, sind sie eine Darstellung eines physischen Geräts und werden auf diese Weise vom System verwaltet. Sie müssen sie nicht erstellen oder initialisieren. Das System stellt eine Liste der verbundenen Benutzeroberflächen-Navigationscontroller und Ereignisse bereit, um Sie zu benachrichtigen, wenn ein Benutzeroberflächen-Navigationscontroller hinzugefügt oder entfernt wird.

Die Liste der Benutzeroberflächen-Navigationscontroller

Die UINavigationController-Klasse stellt die statische Eigenschaft UINavigationControllers bereit, bei der es sich um eine schreibgeschützte Liste der Benutzeroberflächen-Navigationsgeräte handelt, die zurzeit verbunden sind. Da Sie möglicherweise nur an einigen der verbundenen Navigationsgeräte interessiert sind, wird empfohlen, dass Sie eine eigene Sammlung verwalten, statt über die Eigenschaft UINavigationControllers auf diese zuzugreifen.

Im folgenden Beispiel werden alle verbundenen Benutzeroberflächen-Navigationscontroller in eine neue Sammlung kopiert.

auto myNavigationControllers = ref new Vector<UINavigationController^>();

for (auto device : UINavigationController::UINavigationControllers)
{
    // This code assumes that you're interested in all navigation controllers.
    myNavigationControllers->Append(device);
}

Hinzufügen und Entfernen von Benutzeroberflächen-Navigationscontrollern

Wenn ein Benutzeroberflächen-Navigationscontroller hinzugefügt oder entfernt wird, werden die Ereignisse UINavigationControllerAdded und UINavigationControllerRemoved ausgelöst. Sie können einen Ereignishandler für diese Ereignisse zum Nachverfolgen der Navigationsgeräte registrieren, die zurzeit verbunden sind.

Im folgenden Beispiel wird die Nachverfolgung eines Benutzeroberflächen-Navigationsgeräts gestartet, das hinzugefügt wurde.

UINavigationController::UINavigationControllerAdded += ref new EventHandler<UINavigationController^>(Platform::Object^, UINavigationController^ args)
{
    // This code assumes that you're interested in all new navigation controllers.
    myNavigationControllers->Append(args);
}

Im folgenden Beispiel wird die Nachverfolgung eines entfernen Arcade-Joysticks beendet.

UINavigationController::UINavigationControllerRemoved += ref new EventHandler<UINavigationController^>(Platform::Object^, UINavigationController^ args)
{
    unsigned int indexRemoved;

    if(myNavigationControllers->IndexOf(args, &indexRemoved))
	{
        myNavigationControllers->RemoveAt(indexRemoved);
    }
}

Benutzer und Headsets

Jedes Navigationsgerät kann einem Benutzerkonto zugeordnet werden, um die Identität mit der Eingabe zu verknüpfen. Sie können einen Kopfhörer anhängen, um Sprachchat oder die Navigationsfunktionen zu erleichtern. Weitere Informationen zu Benutzern und Headsets finden Sie unter Nachverfolgen von Benutzern und ihren Geräten und Headsets.

Lesen des Benutzeroberflächen-Navigationscontrollers

Nachdem Sie das Benutzeroberflächen-Navigationsgerät identifiziert haben, für das Sie sich interessieren, können Sie Eingaben von ihm erfassen. Anders als im Fall anderer Eingaben, die Sie möglicherweise kennen, teilen Navigationsgeräte Zustandsänderungen jedoch nicht durch das Auslösen von Ereignissen mit. Stattdessen müssen Sie den aktuellen Status regelmäßig lesen, indem Sie ihn abrufen.

Abrufen des Benutzeroberflächen-Navigationscontrollers

Beim Abruf wird eine Momentaufnahme des Navigationsgeräts an einem bestimmten Zeitpunkt erfasst. Dieser Ansatz zum Erfassen von Eingaben ist für die meisten Spiele geeignet, da deren Logik in der Regel in einer deterministischen Schleife ausgeführt wird und nicht ereignisgesteuert ist. Es ist in der Regel auch einfacher, Befehle in Spielen anhand von Eingaben zu interpretieren, die zusammen erfasst werden, als anhand zahlreicher Eingaben, die über die Zeit erfasst werden.

Sie fragen ein Navigationsgerät durch Aufrufen von UINavigationController.GetCurrentReading ab. Diese Funktion gibt UINavigationReading zurück, das den Status des Navigationsgeräts enthält.

auto navigationController = myNavigationControllers[0];

UINavigationReading reading = navigationController->GetCurrentReading();

Lesen der Tastenwerte

Alle Benutzeroberflächen-Navigationstasten stellen einen booleschen Wert bereit, der angibt, ob sie gedrückt (nach unten) oder nicht gedrückt werden (nach oben). Aus Effizienzgründen werden die Tastenwerte nicht als einzelne boolesche Werte dargestellt. Stattdessen werden sie alle in eines von zwei Bitfeldern gepackt, die durch die Enumerationen RequiredUINavigationButtons und OptionalUINavigationButtons dargestellt werden.

Die Schaltflächen im erforderlichen Satz werden von der RequiredButtons-Eigenschaft der UINavigationReading-Struktur gelesen, die Schaltflächen im optionalen werden von der OptionalButtons-Eigenschaft gelesen. Da diese Eigenschaften Bitfelder sind, wird eine bitweise Maskierung verwendet, um den Wert der Taste zu isolieren, an der Sie interessiert sind. Die Taste ist gedrückt (unten), wenn das entsprechende Bit festgelegt ist. Andernfalls ist sie nicht gedrückt (oben).

Im folgenden Beispiel wird ermittelt, ob die Schaltfläche „Annehmen“ im erforderlichen Satz gedrückt ist.

if (RequiredUINavigationButtons::Accept == (reading.RequiredButtons & RequiredUINavigationButtons::Accept))
{
    // Accept is pressed
}

Im folgenden Beispiel wird ermittelt, ob die Schaltfläche „Annehmen“ im erforderlichen Satz nicht gedrückt ist.

if (RequiredUINavigationButtons::None == (reading.RequiredButtons & RequiredUINavigationButtons::Accept))
{
    // Accept is released (not pressed)
}

Verwenden Sie die OptionalButtons-Eigenschaft und die OptionalUINavigationButtons-Enumeration beim Lesen von Schaltflächen im optionalen Satz.

Im folgenden Beispiel wird bestimmt, ob die Context1-Taste im optionalen Satz gedrückt ist.

if (OptionalUINavigationButtons::Context1 == (reading.OptionalButtons & OptionalUINavigationButtons::Context1))
{
    // Context 1 is pressed
}

In einigen Fällen möchten Sie möglicherweise ermitteln, ob eine Taste von „Gedrückt“ zu „Losgelassen“ oder von „Losgelassen“ zu „Gedrückt“ wechselt, ob mehrere Tasten gedrückt oder losgelassen werden, oder ob verschiedene Tasten in einer bestimmten Weise angeordnet sind – einige sind gedrückt, andere nicht. Weitere Informationen zum Ermitteln dieser Bedingungen finden Sie unter Erkennen von Tastenübergängen und Erkennen von komplexen Tastenanordungen.

Beispiel zum Ausführen des Benutzeroberflächen-Navigationscontrollers

Das InputInterfacingUWP-Beispiel (github) veranschaulicht, wie sich verschiedene Eingabegeräte als Benutzeroberflächen-Navigationscontroller verhalten.

Siehe auch

Windows.Gaming.Input.GamepadWindows.Gaming.Input.ArcadeStickWindows.Gaming.Input.RacingWheelWindows.Gaming.Input.IGameController