Partager via


Contrôleur de navigation d’interface utilisateur

Cette page décrit les principes de base de la programmation pour les appareils de navigation d’interface utilisateur à l’aide de Windows.Gaming.Input.UINavigationController et des API associées pour l’plateforme Windows universelle (UWP).

Voici ce que vous allez apprendre à la lecture de cet article :

  • Comment rassembler une liste d’appareils de navigation d’interface utilisateur connectés et de leurs utilisateurs
  • Comment détecter qu’un appareil de navigation a été ajouté ou supprimé
  • Comment lire l’entrée à partir d’un ou plusieurs appareils de navigation d’interface utilisateur
  • Comment les boîtiers de commande et les sticks arcade se comportent comme des appareils de navigation

Vue d’ensemble du contrôleur de navigation d’interface utilisateur

Presque tous les jeux ont au moins une interface utilisateur qui est distincte du gameplay, même si ses menus de pré-jeu ou ses dialogues dans le jeu. Les joueurs doivent pouvoir naviguer dans cette interface utilisateur à l’aide de l’appareil d’entrée choisi, mais il charge les développeurs d’ajouter une prise en charge spécifique pour chaque type d’appareil d’entrée et peut également introduire des incohérences entre les jeux et les appareils d’entrée qui confondent les joueurs. Pour ces raisons, l’API UINavigationController a été créée.

Les contrôleurs de navigation d’interface utilisateur sont des périphériques d’entrée logiques qui existent pour fournir un vocabulaire des commandes courantes de navigation de l’interface utilisateur qui peuvent être prises en charge par divers appareils d’entrée physique . Un contrôleur de navigation d’interface utilisateur n’est qu’un autre moyen d’examiner un appareil d’entrée physique. Nous utilisons l’appareil de navigation pour faire référence à tout appareil d’entrée physique qui est consulté en tant que contrôleur de navigation. En programmation sur un appareil de navigation plutôt que sur des appareils d’entrée spécifiques, les développeurs évitent le fardeau de prendre en charge différents appareils d’entrée et d’atteindre la cohérence par défaut.

Étant donné que le nombre et la variété de contrôles pris en charge par chaque type d’appareil d’entrée peuvent être si différents et que certains appareils d’entrée peuvent souhaiter prendre en charge un ensemble plus riche de commandes de navigation, l’interface du contrôleur de navigation divise le vocabulaire des commandes en un ensemble requis contenant les commandes les plus courantes et essentielles, et un ensemble facultatif contenant des commandes pratiques mais non essentielles. Tous les appareils de navigation prennent en charge chaque commande de l’ensemble requis et peuvent prendre en charge tous, certains ou aucun des commandes du jeu facultatif.

Ensemble obligatoire

Les appareils de navigation doivent prendre en charge toutes les commandes de navigation dans l’ensemble requis ; il s’agit des commandes directionnelles (haut, bas, gauche et droite), affichage, menu, acceptation et annulation des commandes.

Les commandes directionnelles sont destinées à la navigation de focus XY principale entre des éléments d’interface utilisateur uniques. Les commandes d’affichage et de menu sont destinées à afficher des informations de jeu (souvent momentaires, parfois modales) et à basculer entre les contextes de jeu et de menu, respectivement. Les commandes d’acceptation et d’annulation sont destinées aux réponses affirmatives (oui) et négatives (non), respectivement.

Le tableau suivant récapitule ces commandes et leurs utilisations prévues, avec des exemples. | Commande | Utilisation prévue | -------:| --------------- | Haut | Navigation au focus XY vers le haut | Bas | Navigation au focus XY vers le bas | Gauche | Navigation au focus XY à gauche | Droite | Droite de navigation au focus XY | Affichage | Afficher les informations de gameplay (tableau de bord, statistiques de jeu, objectifs, monde ou carte de zone) | Menu | Menu principal / Pause (paramètres, état, équipement, inventaire, pause) | Accepter | Réponse positive (accepter, avancer, confirmer, démarrer, oui) | Annuler | Réponse négative (rejeter, inverser, refuser, arrêter, non)

Ensemble facultatif

Les appareils de navigation peuvent également prendre en charge tous, certains ou aucune des commandes de navigation dans l’ensemble facultatif ; il s’agit de la pagination (haut, bas, gauche et droite), du défilement (haut, bas, gauche et droit) et des commandes contextuelles (contexte 1-4).

Les commandes contextuelles sont explicitement destinées aux commandes spécifiques à l’application et aux raccourcis de navigation. Les commandes de pagination et de défilement sont destinées à la navigation rapide entre les pages ou les groupes d’éléments d’interface utilisateur et à la navigation affinée dans les éléments de l’interface utilisateur, respectivement.

Le tableau suivant récapitule ces commandes et leurs utilisations prévues. | Commande | Utilisation prévue | -----------:| ------------ | PageUp | Monter vers le haut (à la page verticale ou au groupe supérieur/précédent) | PageDown | Descendre vers le bas (vers le bas/suivant la page verticale ou le groupe) | PageLeft | Sauter vers la gauche (vers la gauche/la page horizontale ou le groupe précédent) | PageRight | Accéder à droite (vers la droite/la page horizontale ou le groupe suivant) | ScrollUp | Faire défiler vers le haut (dans l’élément d’interface utilisateur prioritaire ou le groupe à défilement) | ScrollDown | Faites défiler vers le bas (dans l’élément d’interface utilisateur prioritaire ou le groupe à défilement) | ScrollLeft | Faire défiler vers la gauche (dans l’élément d’interface utilisateur prioritaire ou le groupe à défilement) | ScrollRight | Faire défiler vers la droite (dans l’élément d’interface utilisateur prioritaire ou le groupe à défilement) | Context1 | Action de contexte primaire | Context2 | Action de contexte secondaire | Context3 | Troisième action de contexte | Context4 | Quatrième action de contexte

Remarque Bien qu’un jeu soit libre de répondre à une commande avec une fonction réelle différente de son utilisation prévue, le comportement surprenant doit être évité. En particulier, ne modifiez pas la fonction réelle d’une commande si vous avez besoin de son utilisation prévue, essayez d’affecter des fonctions nouvelles à la commande qui est la plus logique et attribuez des fonctions équivalentes à des commandes équivalentes telles que PageUp/PageDown. Enfin, considérez les commandes prises en charge par chaque type d’appareil d’entrée et les contrôles auxquels ils sont mappés, en vous assurant que les commandes critiques sont accessibles à partir de chaque appareil.

Boîtier de commande, stick arcade et navigation au volant de course

Tous les appareils d’entrée pris en charge par l’espace de noms Windows.Gaming.Input sont des appareils de navigation d’interface utilisateur.

Le tableau suivant résume la façon dont l’ensemble requis de commandes de navigation est mappé à différents appareils d’entrée.

Commande de navigation Entrée du boîtier de commande Entrée de stick arcade Entrée du volant de course
Haut Joystick gauche vers le haut / D-pad vers le haut Stick vers le haut Bouton directionnel vers le haut
Descendre Joystick gauche vers le bas / D-pad vers le bas Stick vers le bas Bouton directionnel vers le bas
Left Joystick gauche / D-pad gauche Stick vers la gauche Bouton directionnel vers la gauche
Right Joystick gauche droite / D-pad droit Stick vers la droite Bouton directionnel vers la droite
Afficher Bouton Afficher Bouton Afficher Bouton Afficher
Menu Bouton Menu Bouton de menu Bouton Menu
Accepter Bouton A Bouton Action 1 Bouton A
Annuler Bouton B Bouton Action 2 Bouton B

Le tableau suivant résume la façon dont l’ensemble facultatif de commandes de navigation est mappé à différents appareils d’entrée.

Commande de navigation Entrée du boîtier de commande Entrée de stick arcade Entrée du volant de course
Pg préc Déclencheur gauche non pris en charge varie
Pg suiv Déclencheur droit non pris en charge varie
PageLeft Gâchette gauche non pris en charge varie
PageRight Gâchette droite non pris en charge varie
ScrollUp Faire défiler le joystick droit vers le haut non pris en charge varie
ScrollDown Faire défiler le joystick droit vers le bas non pris en charge varie
ScrollLeft Faire défiler le joystick droit vers la gauche non pris en charge varie
ScrollRight Faire défiler le joystick droit vers la droite non pris en charge varie
Context1 Bouton X non pris en charge Bouton X (généralement)
Context2 Bouton Y non pris en charge Bouton Y (couramment)
Contexte3 Appuyez sur le joystick gauche non pris en charge varie
Contexte4 Appuyez sur le joystick droit non pris en charge varie

Détecter et suivre les contrôleurs de navigation d’interface utilisateur

Bien que les contrôleurs de navigation d’interface utilisateur soient des périphériques d’entrée logiques, ils représentent un appareil physique et sont gérés par le système de la même façon. Vous n’avez pas besoin de les créer ou de les initialiser ; le système fournit la liste des contrôleurs de navigation d’interface utilisateur connectés et des événements pour vous avertir lorsqu’un contrôleur de navigation de l’interface utilisateur est ajouté ou supprimé.

Liste des contrôleurs de navigation d’interface utilisateur

La classe UINavigationController fournit une propriété statique, UINavigationControllers, qui est une liste en lecture seule d’appareils de navigation d’interface utilisateur actuellement connectés. Étant donné que vous n’êtes peut-être intéressé que par certains des appareils de navigation connectés, il est recommandé de conserver votre propre collection au lieu de les accéder via la UINavigationControllers propriété.

L’exemple suivant copie tous les contrôleurs de navigation d’interface utilisateur connectés dans une nouvelle collection.

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);
}

Ajout et suppression de contrôleurs de navigation d’interface utilisateur

Lorsqu’un contrôleur de navigation d’interface utilisateur est ajouté ou supprimé, les événements UINavigationControllerAdded et UINavigationControllerRemoved sont déclenchés. Vous pouvez inscrire un gestionnaire d’événements pour ces événements afin de suivre les appareils de navigation actuellement connectés.

L’exemple suivant démarre le suivi d’un appareil de navigation d’interface utilisateur qui a été ajouté.

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);
}

L’exemple suivant arrête le suivi d’un stick arcade qui a été supprimé.

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

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

Utilisateurs et casques

Chaque appareil de navigation peut être associé à un compte d’utilisateur pour lier son identité à son entrée et peut avoir un casque attaché pour faciliter la conversation vocale ou les fonctionnalités de navigation. Pour en savoir plus sur l’utilisation des utilisateurs et des casques, consultez Suivi des utilisateurs et de leurs appareils et casque.

Lecture du contrôleur de navigation de l’interface utilisateur

Une fois que vous avez identifié l’appareil de navigation de l’interface utilisateur qui vous intéresse, vous êtes prêt à recueillir des entrées à partir de celle-ci. Toutefois, contrairement à d’autres types d’entrée que vous pouvez utiliser, les appareils de navigation ne communiquent pas le changement d’état en déclenchant des événements. À la place, vous devez les interroger régulièrement pour connaître leur état actuel.

Interrogation du contrôleur de navigation de l’interface utilisateur

Le processus d’interrogation capture un instantané du périphérique de navigation à un moment précis. Cette approche de la collecte d’entrée est adaptée à la plupart des jeux, car leur logique s’exécute généralement dans une boucle déterministe plutôt que d’être pilotée par les événements ; il est généralement plus simple d’interpréter les commandes de jeu à partir d’entrées collectées en même temps que de nombreuses entrées uniques collectées au fil du temps.

Vous interrogez un appareil de navigation en appelant UINavigationController.GetCurrentReading. Cette fonction retourne un UINavigationReading qui contient l’état de l’appareil de navigation.

auto navigationController = myNavigationControllers[0];

UINavigationReading reading = navigationController->GetCurrentReading();

Lecture des boutons

Chacun des boutons de navigation de l’interface utilisateur fournit une lecture booléenne qui correspond à son appui (bas) ou relâché (haut). Pour plus d’efficacité, les lectures de boutons ne sont pas représentées en tant que valeurs booléennes individuelles ; Au lieu de cela, ils sont tous emballés dans l’un des deux champs de bits représentés par les énumérations RequiredUINavigationButtons et OptionalUINavigationButtons .

Les boutons appartenant au jeu requis sont lus à partir de la propriété de la RequiredButtons structure UINavigationReading ; les boutons appartenant au jeu facultatif sont lus à partir de la OptionalButtons propriété. Étant donné que ces propriétés sont des champs de bits, le masquage au niveau du bit est utilisé pour isoler la valeur du bouton qui vous intéresse. Le bouton est enfoncé (bas) lorsque le bit correspondant est défini ; sinon, sa sortie (vers le haut).

L’exemple suivant détermine si le bouton Accepter dans le jeu requis est enfoncé.

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

L’exemple suivant détermine si le bouton Accepter dans l’ensemble requis est libéré.

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

Veillez à utiliser la propriété et OptionalUINavigationButtons l’énumération lors de la OptionalButtons lecture des boutons dans le jeu facultatif.

L’exemple suivant détermine si le bouton Contexte 1 dans le jeu facultatif est appuyé.

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

Parfois, vous souhaiterez peut-être déterminer quand un bouton passe d’un bouton enfoncé à l’appui ou relâché, si plusieurs boutons sont enfoncés ou relâchés, ou si un ensemble de boutons est disposé d’une manière particulière, certains non. Pour obtenir plus d’informations sur la détection de ces conditions, consultez Détection des transitions de boutons et Détection des dispositions complexes des boutons.

Exécuter l’exemple de contrôleur de navigation d’interface utilisateur

L’exemple InputInterfacingUWP (github) montre comment les différents appareils d’entrée se comportent en tant que contrôleurs de navigation d’interface utilisateur.

Voir aussi

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