Outils d'utilisateurs

Outils du Site


qt_gamepad_implementation_windows_premiere_partie

Différences

Cette page vous donne les différences entre la révision choisie et la version actuelle de la page.

Lien vers cette vue

qt_gamepad_implementation_windows_premiere_partie [2014/03/09 17:37]
gbdivers créée
qt_gamepad_implementation_windows_premiere_partie [2014/04/05 19:34] (Version actuelle)
87.100.112.252 [La classe GamepadEvent]
Ligne 12: Ligne 12:
 ====== Introduction ====== ====== Introduction ======
  
-Pour commencer, je dois avouer une chose : je n'avais jamais utiliser un gamepad en C++ avant de commencer cette série d'articles. Donc il me fallait une base de travail. Comme je suis actuellement sous Windows, je vais faire simple, je vais m'intéresser dans un premier temps à l'implémentation sur cette plateforme, on verra pour Linux et Android ensuite (je n'ai pas de Mac OS X, j'aurais besoin d'un coup de main pour le portage dessus). Donc la chose la plus simple à faire est de demander en Microsoft : [[http://msdn.microsoft.com/en-us/library/windows/desktop/dd757116(v=vs.85).aspx|MSDN - Dev Center - Multimedia Input - Joysticks]].+Pour commencer, je dois avouer une chose : je n'avais jamais utilisé un gamepad en C++ avant de commencer cette série d'articles. Donc il me fallait une base de travail. Comme je suis actuellement sous Windows, je vais faire simple, je vais m'intéresser dans un premier temps à l'implémentation sur cette plateforme, on verra pour Linux et Android ensuite (je n'ai pas de Mac OS X, j'aurais besoin d'un coup de main pour le portage dessus). Donc la chose la plus simple à faire est de demander à Microsoft : [[http://msdn.microsoft.com/en-us/library/windows/desktop/dd757116(v=vs.85).aspx|MSDN - Dev Center - Multimedia Input - Joysticks]].
  
 Le second point important est comment implémenter cela dans Qt. Plusieurs approches sont possibles : Le second point important est comment implémenter cela dans Qt. Plusieurs approches sont possibles :
Ligne 32: Ligne 32:
 Pour gérer les gamepad, il faut : Pour gérer les gamepad, il faut :
  
-  * récupérer la liste des gamepad et leurs fonctionnalités (capacities) disponibles.+  * récupérer la liste des gamepads et leurs fonctionnalités (capacities) disponibles.
   * s'informer régulièrement des l'états des boutons.   * s'informer régulièrement des l'états des boutons.
   * ou ajouter des fonctions callback pour que le gamepad informe l'application lorsqu'il  a des mises à jour des valeurs.   * ou ajouter des fonctions callback pour que le gamepad informe l'application lorsqu'il  a des mises à jour des valeurs.
Ligne 38: Ligne 38:
 Comme l'objectif est d'émettre un signal ou un événement lors d'une action de l'utilisateur sur le gamepad, les fonctions callback semblent être la meilleure approche a priori. Cependant, ces fonctions callback ne sont disponibles que pour les fonctions de base du gamepad (josGetPos). Et malheureusement, la gestion d'un gamepad complet (plusieurs sticks numériques, plusieurs boutons) n'est possible qu'avec les fonctions étendues (josGetPosEx). Comme l'objectif est d'émettre un signal ou un événement lors d'une action de l'utilisateur sur le gamepad, les fonctions callback semblent être la meilleure approche a priori. Cependant, ces fonctions callback ne sont disponibles que pour les fonctions de base du gamepad (josGetPos). Et malheureusement, la gestion d'un gamepad complet (plusieurs sticks numériques, plusieurs boutons) n'est possible qu'avec les fonctions étendues (josGetPosEx).
  
-Donc, il va falloir opérer différemment. Il faut créer un timer qui lit l'état du gamepad à interval régulier et le compare à l'état précédent. Si une valeur à changée, on émet un signal ou un event.+Donc, il va falloir opérer différemment. Il faut créer un timer qui lit l'état du gamepad à intervalle régulier et le compare à l'état précédent. Si une valeur changée, on émet un signal ou un event.
  
 ===== Détecter les gamepads connectés ===== ===== Détecter les gamepads connectés =====
  
-Il est possible de gérer jusqu'à 16 gamepads en même temps avec les pilotes Windows. Il faut inclure le fichier d'en-tête window.h et la bibliothèque Winmm.dll. Chaque gamepad physique est identifié par un ID de type unsigned int. Il faut également gérer les gamepads virtuels, donc on va réserver les valeurs d'ID inférieur à 256 pour les gamepads physiques.+Il est possible de gérer jusqu'à 16 gamepads en même temps avec les pilotes Windows. Il faut inclure le fichier d'en-tête window.h et la bibliothèque Winmm.dll. Chaque gamepad physique est identifié par un ID de type unsigned int. Il faut également gérer les gamepads virtuels, donc on va réserver les valeurs d'ID inférieures à 256 pour les gamepads physiques.
  
 Pour connaître le nombre de gamepads physiques possibles, il faut utiliser la fonction joyGetNumDevs : Pour connaître le nombre de gamepads physiques possibles, il faut utiliser la fonction joyGetNumDevs :
Ligne 62: Ligne 62:
 </code> </code>
  
-Pour commencer, on vas tester la connexion de tous les gamepads à chaque update du timer. terme, il faudra tester le coût de ces tests en continue et voir s'il faut optimiser (faire un test des connexions moins souvent que le test des changements de valeur).+Pour commencer, on va tester la connexion de tous les gamepads à chaque update du timer. À terme, il faudra tester le coût de ces tests en continu et voir s'il faut optimiser (faire un test des connexions moins souvent que le test des changements de valeur).
  
 ===== Récupérer les informations d'un gamepad ===== ===== Récupérer les informations d'un gamepad =====
Ligne 74: Ligne 74:
 </code> </code>
  
-Les différents sticks et boutons sont identifiés avec des lettres et des chiffres. Il n'est pas possible de nommer explicitement ces éléments puisqu'ils peuvent changer d'une manette à l'autre. L'image suivante présente la correspondance des identifiants sur une manette XBox. Je détaillerais ça dans un prochain article.+Les différents sticks et boutons sont identifiés avec des lettres et des chiffres. Il n'est pas possible de nommer explicitement ces éléments puisqu'ils peuvent changer d'une manette à l'autre. L'image suivante présente la correspondance des identifiants sur une manette XBox. Je détaillerai ça dans un prochain article.
  
 {{ :x360controller2.png?500 | Liste des contrôles sur une manettes XBox }} {{ :x360controller2.png?500 | Liste des contrôles sur une manettes XBox }}
Ligne 116: Ligne 116:
 ===== La classe GamepadEvent ===== ===== La classe GamepadEvent =====
  
-La classe GamepadEvent dérive de QEvent et définie un nouveau type d'événement. La définition des fonctionnalités de base de cette classe est la suivante :+La classe GamepadEvent dérive de QEvent et définit un nouveau type d'événement. La définition des fonctionnalités de base de cette classe est la suivante :
  
 <code cpp-qt> <code cpp-qt>
Ligne 159: Ligne 159:
 </code> </code>
  
-Id correspond à l’identifiant du gamepad, les valeurs réelles sont comprise entre -1 et 1 et correspondent aux boutons analogiques du gamepad (sticks, gachettes), sauf la valeur POV (point-of-view) qui est comprise entre 0 et 360 degrés. Les boutons correspondante à une combinaison de valeurs qu'il faut tester avec l'opérateur binaire AND :+Id correspond à l’identifiant du gamepad, les valeurs réelles sont comprises entre -1 et 1 et correspondent aux boutons analogiques du gamepad (sticks, gachettes), sauf la valeur POV (point-of-view) qui est comprise entre 0 et 360 degrés. Les boutons correspondants à une combinaison de valeurs qu'il faut tester avec l'opérateur binaire AND :
  
 <code cpp-qt> <code cpp-qt>
qt_gamepad_implementation_windows_premiere_partie.1394383033.txt.gz · Dernière modification: 2014/03/09 17:37 par gbdivers