Benutzeroberflächen-Navigationscontroller
Auf dieser Seite werden die Grundlagen der Programmierung für Ui-Navigationsgeräte mit Windows.Gaming.Input.UINavigationController und verwandten APIs für die Universelle Windows-Plattform (UWP) beschrieben.
Auf dieser Seite erhalten Sie Informationen zu folgenden Vorgängen:
- So sammeln Sie eine Liste der verbundenen Benutzeroberflächennavigationsgeräte und deren Benutzer
- So wird's gemacht: Erkennen, dass ein Navigationsgerät hinzugefügt oder entfernt wurde
- Lesen von Eingaben von einem oder mehreren Benutzeroberflächennavigationsgeräten
- Verhalten von Gamepads und Arcade-Joysticks als Navigationsgeräte
Übersicht über den Benutzeroberflächennavigationscontroller
Fast alle Spiele verfügen über mindestens eine Benutzeroberfläche, die vom Spiel getrennt ist, auch wenn es sich nur um Pregame-Menüs oder In-Game-Dialogfelder handelt. Spieler müssen in der Lage sein, mithilfe des ausgewählten Eingabegeräts in dieser Benutzeroberfläche zu navigieren, aber es belastet Entwickler, spezifische Unterstützung für jede Art von Eingabegerät hinzuzufügen und kann auch Inkonsistenzen zwischen Spielen und Eingabegeräten einführen, die Spieler verwirren. Aus diesen Gründen wurde die UINavigationController-API erstellt.
Ui-Navigationscontroller sind logische Eingabegeräte, die vorhanden sind, um ein Vokabular allgemeiner Benutzeroberflächennavigationsbefehle bereitzustellen, die von einer Vielzahl physischer Eingabegeräte unterstützt werden können. Ein Benutzeroberflächen-Navigationscontroller ist nur eine andere Möglichkeit, ein physisches Eingabegerät zu betrachten. Wir verwenden navigationsgerät, um auf jedes physische Eingabegerät zu verweisen, das als Navigationscontroller angezeigt wird. Durch die Programmierung mit einem Navigationsgerät anstelle bestimmter Eingabegeräte vermeiden Entwickler die Unterstützung verschiedener Eingabegeräte und erzielen standardmäßig Konsistenz.
Da die Anzahl und Vielzahl von Steuerelementen, die von jeder Art von Eingabegerät unterstützt werden, so unterschiedlich sein kann und weil bestimmte Eingabegeräte möglicherweise einen umfangreicheren Satz von Navigationsbefehlen unterstützen möchten, teilt die Navigationscontrollerschnittstelle das Vokabular von Befehlen in einen erforderlichen Satz mit den häufigsten und wesentlichen Befehlen und einen optionalen Satz mit praktischen, aber nicht erforderlichen Befehlen auf. Alle Navigationsgeräte unterstützen jeden Befehl im erforderlichen Satz und unterstützen möglicherweise alle, einige oder keine der Befehle im optionalen Satz.
Erforderlicher Satz
Navigationsgeräte müssen alle Navigationsbefehle im erforderlichen Satz unterstützen. Hierbei handelt es sich um die Richtung (nach oben, unten, links und rechts), Ansicht, Menü, Akzeptieren und Abbrechen von Befehlen.
Die Richtungsbefehle sind für die primäre XY-Fokusnavigation zwischen einzelnen UI-Elementen vorgesehen. Die Ansichts- und Menübefehle sind für die Anzeige von Spielinformationen (oft momentär, manchmal modal) und für den Wechsel zwischen Spiel- und Menükontexten vorgesehen. Die Befehle "Annehmen" und "Abbrechen" sind für positive (ja) bzw. negative Antworten (nein) vorgesehen.
In der folgenden Tabelle sind diese Befehle und deren beabsichtigte Verwendung 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 (Scoreboard, Spielstatistiken, Ziele, Welt- oder Flächenkarte) | Menü | Primäres Menü / Pause (Einstellungen, Status, Ausrüstung, Bestand, Pause) | Annehmen | Bestätigungsantwort (Annehmen, Voraus, Bestätigen, Start, Ja) | Abbrechen | Negative Antwort (Ablehnen, Umkehren, Ablehnen, Beenden, Nein)
Optionaler Satz
Navigationsgeräte unterstützen möglicherweise auch alle, einige oder keines der Navigationsbefehle im optionalen Satz. Dies sind die Auslagerungsbefehle (nach oben, unten, links und rechts), Bildlauf (nach oben, unten, links und rechts) und kontextbezogene Befehle (Kontext 1-4).
Die Kontextbefehle sind explizit für anwendungsspezifische Befehle und Navigationsverknüpfungen vorgesehen. Die Auslagerungs- und Bildlaufbefehle sind für die schnelle Navigation zwischen Seiten oder Gruppen von UI-Elementen sowie für eine differenzierte Navigation innerhalb von UI-Elementen vorgesehen.
In der folgenden Tabelle sind diese Befehle und deren beabsichtigte Verwendung 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 bildlauffähigen Gruppe) | ScrollDown | Bildlauf nach unten (innerhalb des fokussierten UI-Elements oder einer bildlauffähigen Gruppe) | ScrollLeft | Bildlauf nach links (innerhalb eines fokussierten UI-Elements oder einer bildlauffähigen Gruppe) | ScrollRight | Scrollen sie nach rechts (innerhalb eines fokussierten UI-Elements oder einer bildlauffähigen Gruppe) | Kontext1 | Primäre Kontextaktion | Kontext2 | 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 die beabsichtigte Verwendung benötigen, versuchen Sie, dem Befehl neue Funktionen zuzuweisen, die am sinnvollsten sind, und weisen Sie entsprechungsfunktionen gegensprechende Befehle wie PageUp/PageDown zu. Überlegen Sie schließlich, welche Befehle von jeder Art von Eingabegerät unterstützt werden und welchen Steuerelementen sie zugeordnet sind, um sicherzustellen, dass wichtige Befehle von jedem Gerät aus zugänglich sind.
Gamepad, Arcade-Joystick und Rennlenkradnavigation
Alle eingabegeräte, die vom Windows.Gaming.Input-Namespace unterstützt werden, sind Ui-Navigationsgeräte.
In der folgenden Tabelle wird zusammengefasst, wie die erforderlichen Navigationsbefehle verschiedenen Eingabegeräten zugeordnet werden.
Navigationsbefehl | Gamepad-Eingabe | Eingabe für den Arcade-Stick | Rennlenkradeingabe |
---|---|---|---|
Up | Linker Ministick nach oben / Steuerkreuz nach oben | Stick nach oben | Steuerkreuz nach oben |
Nach unten | Linker Ministick nach unten / Steuerkreuz nach unten | Stick nach unten | Steuerkreuz nach unten |
Nach links | Linker Ministick nach links / Steuerkreuz nach links | Stick nach links | Steuerkreuz nach links |
Right | Linker Ministick nach rechts / Steuerkreuz nach rechts | Stick nach rechts | Steuerkreuz nach rechts |
Sicht | Ansicht-Taste | Ansicht-Taste | Ansicht-Taste |
Menü | Menü-Taste | Menüschaltfläche | Menü-Taste |
Annehmen | A-Taste | Aktionsschaltfläche 1 | A-Taste |
Abbrechen | B-Taste | Aktionsschaltfläche 2 | B-Taste |
In der folgenden Tabelle wird zusammengefasst, wie die optionale Gruppe von Navigationsbefehlen verschiedenen Eingabegeräten zugeordnet wird.
Navigationsbefehl | Gamepad-Eingabe | Eingabe für den Arcade-Stick | Rennlenkradeingabe |
---|---|---|---|
BildAuf | Linker Trigger | nicht unterstützt | variiert |
BildAb | 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 |
Kontext1 | X-Schaltfläche | nicht unterstützt | X-Taste (allgemein) |
Context2 | Schaltfläche "Y" | nicht unterstützt | Y-Taste (allgemein) |
Context3 | Linken Ministick drücken | nicht unterstützt | variiert |
Context4 | Rechten Ministick drücken | nicht unterstützt | variiert |
Erkennen und Nachverfolgen von Ui-Navigationscontrollern
Obwohl Benutzeroberflächennavigationscontroller logische Eingabegeräte sind, sind sie eine Darstellung eines physischen Geräts und werden vom System auf die gleiche Weise verwaltet. Sie müssen sie nicht erstellen oder initialisieren. das System stellt eine Liste der verbundenen BENUTZEROBERFLÄCHEN-Navigationscontroller und -ereignisse bereit, die Sie benachrichtigen, wenn ein Benutzeroberflächennavigationscontroller hinzugefügt oder entfernt wird.
Liste der Benutzeroberflächennavigationscontroller
Die UINavigationController-Klasse bietet eine statische Eigenschaft, UINavigationControllers, die eine schreibgeschützte Liste von UI-Navigationsgeräten ist, die derzeit verbunden sind. Da Sie möglicherweise nur an einigen der verbundenen Navigationsgeräte interessiert sind, empfiehlt es sich, ihre eigene Sammlung zu verwalten, anstatt über die UINavigationControllers
Eigenschaft darauf zuzugreifen.
Im folgenden Beispiel werden alle verbundenen UI-Navigationscontroller in eine neue Auflistung 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 UI-Navigationscontrollern
Wenn ein Benutzeroberflächennavigationscontroller hinzugefügt oder entfernt wird, werden die EREIGNISSE UINavigationControllerAdded und UINavigationControllerRemoved ausgelöst. Sie können einen Ereignishandler für diese Ereignisse registrieren, um die derzeit verbundenen Navigationsgeräte nachzuverfolgen.
Im folgenden Beispiel wird die Nachverfolgung eines hinzugefügten UI-Navigationsgeräts gestartet.
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 entfernten 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 seine Identität mit seiner Eingabe zu verknüpfen, und es kann eine Kopfhörer angefügt werden, um Sprachchats oder Navigationsfeatures zu erleichtern. Weitere Informationen zum Arbeiten mit Benutzern und Headsets finden Sie unter Nachverfolgen von Benutzern und ihren Geräten und Headset.
Lesen des Benutzeroberflächennavigationscontrollers
Nachdem Sie das benutzeroberflächen-Navigationsgerät identifiziert haben, an dem Sie interessiert sind, können Sie Eingaben daraus sammeln. Im Gegensatz zu anderen Arten von Eingaben, für die Sie möglicherweise verwendet werden, kommunizieren Navigationsgeräte keine Zustandsänderung durch Auslösen von Ereignissen. Stattdessen müssen Sie den aktuellen Status regelmäßig auslesen, indem Sie ihn abrufen.
Abrufen des Benutzeroberflächennavigationscontrollers
Durch das Abrufen wird eine Momentaufnahme des Navigationsgeräts 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 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 rufen ein Navigationsgerät ab, indem Sie UINavigationController.GetCurrentReading aufrufen. Diese Funktion gibt eine UINavigationReading zurück, die den Status des Navigationsgeräts enthält.
auto navigationController = myNavigationControllers[0];
UINavigationReading reading = navigationController->GetCurrentReading();
Auslesen der Tasten
Jede der Ui-Navigationsschaltflächen stellt einen booleschen Lesewert bereit, der angibt, ob sie gedrückt (nach unten) oder losgelassen (nach oben) ist. Aus Effizienzgründen werden Die Lesewerte von Schaltflächen nicht als einzelne boolesche Werte dargestellt; Stattdessen sind sie alle in einem von zwei Bitfeldern zusammengefasst, die durch die EnumerationEn RequiredUINavigationButtons und OptionalUINavigationButtons dargestellt werden.
Die Schaltflächen, die zum erforderlichen Satz gehören, werden aus der RequiredButtons
Eigenschaft der UINavigationReading-Struktur gelesen. Die Schaltflächen, die zum optionalen Satz gehören, werden aus der OptionalButtons
Eigenschaft gelesen. Da es sich bei diesen Eigenschaften um Bitfelder handelt, wird die bitweise Maskierung verwendet, um den Wert der Schaltfläche zu isolieren, an der Sie interessiert sind. Die Taste wird gedrückt (unten), wenn das entsprechende Bit festgelegt ist; andernfalls wird sie freigegeben (nach oben).
Im folgenden Beispiel wird ermittelt, ob die Schaltfläche "Annehmen" im erforderlichen Satz gedrückt wird.
if (RequiredUINavigationButtons::Accept == (reading.RequiredButtons & RequiredUINavigationButtons::Accept))
{
// Accept is pressed
}
Im folgenden Beispiel wird ermittelt, ob die Schaltfläche "Annehmen" im erforderlichen Satz freigegeben wird.
if (RequiredUINavigationButtons::None == (reading.RequiredButtons & RequiredUINavigationButtons::Accept))
{
// Accept is released (not pressed)
}
Achten Sie darauf, die OptionalButtons
Eigenschaft und OptionalUINavigationButtons
Enumeration beim Lesen von Schaltflächen im optionalen Satz zu verwenden.
Im folgenden Beispiel wird ermittelt, ob die Schaltfläche "Kontext 1" im optionalen Satz gedrückt wird.
if (OptionalUINavigationButtons::Context1 == (reading.OptionalButtons & OptionalUINavigationButtons::Context1))
{
// Context 1 is pressed
}
Manchmal möchten Sie vielleicht bestimmen, wann eine Taste von gedrückter taste in losgelassen oder losgelassen wird, ob mehrere Tasten gedrückt oder losgelassen werden, oder ob eine Reihe von Schaltflächen auf eine bestimmte Weise angeordnet sind - einige gedrückt, andere nicht. Informationen zum Erkennen dieser Bedingungen finden Sie unter Erkennen von Schaltflächenübergängen und Erkennen komplexer Tastenanordnungen.
Ausführen des Beispiels für den Benutzeroberflächennavigationscontroller
Das InputInterfacingUWP-Beispiel (github) veranschaulicht, wie sich die verschiedenen Eingabegeräte als BENUTZEROBERFLÄCHEN-Navigationscontroller verhalten.
Weitere Informationen
Windows.Gaming.Input.GamepadWindows.Gaming.Input.ArcadeStickWindows.Gaming.Input.RacingWheelWindows.Gaming.Input.IGameController