Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Cette page décrit les principes de base de la programmation pour les sticks de vol certifiés Xbox One à l’aide de Windows.Gaming.Input.FlightStick et des API associées pour la plateforme Windows universelle (UWP).
En lisant cette page, vous allez apprendre :
- comment rassembler une liste de sticks de vol connectés et de leurs utilisateurs
- comment détecter qu’un stick de vol a été ajouté ou supprimé
- comment lire l’entrée à partir d’un ou plusieurs sticks de vol
- comportement des sticks de vol en tant qu’appareils de navigation d’interface utilisateur
Aperçu
Les manettes de vol sont des périphériques de jeux vidéo appréciés pour reproduire la sensation des commandes présentes dans le cockpit d'un avion ou d'un vaisseau spatial. Il s’agit de l’appareil d’entrée parfait pour un contrôle rapide et précis du vol. Les manettes de vol sont prises en charge dans les applications Windows 10 ou Windows 11 et Xbox One via le namespace Windows.Gaming.Input.
Les sticks de vol certifiés Xbox One sont équipés des contrôles suivants :
- Un joystick analogique tordu capable de rouler, de tanger et de lacet
- Manette analogique
- Deux boutons d’incendie
- Un commutateur de chapeau numérique 8 voies
- boutons Afficher et boutons Menu
Remarque
Les boutons d’affichage
Navigation de l’interface utilisateur
Afin de faciliter la prise en charge des différents appareils d’entrée pour la navigation de l’interface utilisateur et d’encourager la cohérence entre les jeux et les appareils, la plupart appareils d’entrée physiques agissent simultanément comme des appareils d’entrée logiques appelés contrôleurs de navigation de l’interface utilisateur . Le contrôleur de navigation de l’interface utilisateur fournit un vocabulaire courant pour les commandes de navigation de l’interface utilisateur sur les appareils d’entrée.
En tant que contrôleur de navigation de l’interface utilisateur, un stick de vol associe l'ensemble requis des commandes de navigation au joystick et aux boutons View, Menu, FirePrimary, et FireSecondary.
Commande de navigation | Entrée de stick de vol |
---|---|
Vers le haut | Joystick en haut |
Vers le bas | Joystick vers le bas |
Gauche | Joystick gauche |
Droite | Joystick droit |
Afficher | bouton Affichage |
Menu | Menu bouton |
Accepter | bouton FirePrimary |
Annuler | bouton FireSecondary |
Les sticks de vol ne mappent aucun des ensemble facultatif des commandes de navigation.
Détecter et suivre les bâtons de vol
La détection et le suivi des bâtons de vol fonctionnent exactement de la même façon que pour les manettes de jeu, sauf avec la classe FlightStick au lieu de la classe Gamepad . Pour plus d'informations, consultez la manette et la vibration.
Lecture du bâton de vol
Une fois que vous avez identifié la manette de vol qui vous intéresse, vous êtes prêt à collecter les informations à partir de celle-ci. Toutefois, contrairement à d’autres types d’entrée que vous pouvez utiliser, les sticks de vol ne communiquent pas le changement d’état en déclenchant des événements. Au lieu de cela, vous prenez des lectures régulières de leur état actuel en les interroger.
Interrogation du stick de vol
L’interrogation capture un instantané du stick de vol à un moment précis dans le temps. 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 également généralement plus simple d’interpréter les commandes de jeu à partir d’entrées collectées toutes à la fois qu’à partir de nombreuses entrées uniques collectées progressivement.
Vous interrogez un stick de vol en appelant FlightStick.GetCurrentReading. Cette fonction retourne une FlightStickReading qui contient l’état du stick de vol.
L’exemple suivant interroge un stick de vol pour son état actuel :
auto flightStick = myFlightSticks->GetAt(0);
FlightStickReading reading = flightStick->GetCurrentReading();
En plus de l’état du stick de vol, chaque lecture inclut un horodatage qui indique précisément quand l’état a été récupéré. L’horodatage est utile pour se rapporter au minutage des lectures précédentes ou au minutage de la simulation de jeu.
Lecture du joystick et de la manette des gaz
Le joystick fournit une lecture analogique comprise entre -1.0 et 1.0 dans les axes X, Y et Z (roll, pitch et yaw, respectivement). Pour le roulis, une valeur de -1,0 correspond à la position de joystick la plus à gauche, tandis qu’une valeur de 1,0 correspond à la position la plus à droite. Pour la hauteur, la valeur -1,0 correspond à la position du joystick le plus bas, tandis qu’une valeur de 1,0 correspond à la position la plus haute. Pour le lacet, une valeur de -1.0 correspond à la position la plus inverse, tordue, tandis qu’une valeur de 1,0 correspond à la position la plus au niveau des aiguilles d’une montre.
Dans tous les axes, la valeur est d’environ 0,0 lorsque le joystick est en position centrale, mais il est normal que la valeur précise varie, même entre les lectures suivantes. Les stratégies d’atténuation de cette variation sont abordées plus loin dans cette section.
La valeur du roulis du joystick est lue à partir de la propriété FlightStickReading.Roll, la valeur du tangage est lue à partir de la propriété FlightStickReading.Pitch, et la valeur du lacet est lue à partir de la propriété FlightStickReading.Yaw :
// Each variable will contain a value between -1.0 and 1.0.
float roll = reading.Roll;
float pitch = reading.Pitch;
float yaw = reading.Yaw;
Lorsque vous lisez les valeurs du joystick, vous remarquerez qu’elles ne produisent pas de manière fiable une lecture neutre de 0,0 lorsque le joystick est au repos dans la position centrale ; Au lieu de cela, ils produisent des valeurs différentes près de 0,0 chaque fois que le joystick est déplacé et retourné à la position centrale. Pour atténuer ces variations, vous pouvez implémenter une petite zone morte , qui est une plage de valeurs près de la position centrale idéale qui sont ignorées.
Une façon d’implémenter une zone morte consiste à déterminer la distance à laquelle le joystick s’est déplacé du centre, et ignorer les lectures qui sont plus proches que certaines distances que vous choisissez. Vous pouvez calculer la distance à peu près. Ce n’est pas exact, car les lectures du joystick sont essentiellement des valeurs polaires et non planaires, simplement en utilisant le théorème de Pythagore. Cela produit une zone morte radiale.
L’exemple suivant illustre une zone morte radiale de base à l’aide du théorème pythagorean :
// 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.
}
Lecture des boutons et du commutateur de chapeau
Chacun des deux boutons de feu du stick de vol fournit une lecture numérique qui indique s’il est enfoncé (bas) ou relâché (haut). Pour plus d’efficacité, les lectures de boutons ne sont pas représentées en tant que booléens individuels. Elles sont toutes regroupées dans un unique champ de bits représenté par l'énumération FlightStickButtons. En outre, le commutateur de chapeau 8 voies fournit un sens emballé dans un champ de bits unique représenté par l’énumération GameControllerSwitchPosition.
Remarque
Les sticks de vol sont équipés de boutons supplémentaires utilisés pour la navigation de l’interface utilisateur, tels que le bouton d’affichage et le bouton Menu. Ces boutons ne font pas partie de l’énumération FlightStickButtons
et ne peuvent être lus qu’en accédant au stick de vol en tant qu’appareil de navigation d’interface utilisateur. Pour plus d’informations, consultez le contrôleur de navigation de l’interface utilisateur .
Les valeurs de bouton sont lues à partir de la propriété FlightStickReading.Buttons. Étant donné que cette propriété est un champ 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 activé ; sinon, le bouton est relâché (haut).
L’exemple suivant détermine si le bouton FirePrimary est enfoncé :
if (FlightStickButtons::FirePrimary == (reading.Buttons & FlightStickButtons::FirePrimary))
{
// FirePrimary is pressed.
}
L’exemple suivant détermine si le bouton firePrimary est libéré :
if (FlightStickButtons::None == (reading.Buttons & FlightStickButtons::FirePrimary))
{
// FirePrimary is released (not pressed).
}
Parfois, vous souhaiterez peut-être déterminer quand un bouton passe de l'état enfoncé à relâché ou inversement, 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 étant enfoncés et d'autres non. Pour plus d’informations sur la détection de chacune de ces conditions, consultez Détection des transitions de boutons et détection des dispositions complexes de boutons.
La valeur du commutateur de chapeau est lue à partir de la propriété FlightStickReading.HatSwitch. Étant donné que cette propriété est également un champ de bits, le masquage au niveau du bit est à nouveau utilisé pour isoler la position du hat switch.
L’exemple suivant détermine si le commutateur de chapeau est en position haut :
if (GameControllerSwitchPosition::Up == (reading.HatSwitch & GameControllerSwitchPosition::Up))
{
// The hat switch is in the up position.
}
L’exemple suivant détermine si le commutateur de chapeau est à la position centrale :
if (GameControllerSwitchPosition::Center == (reading.HatSwitch & GameControllerSwitchPosition::Center))
{
// The hat switch is in the center position.
}