Utiliser un joystick ou joypad sous Windows

Utiliser un joystick ou joypad sous Windows

joyGetNumDevs, joyGetPosEx

Voir version :

Pas de dépendances

Télécharger :

#include <windows.h>
#include <stdio.h>
#pragma comment(lib,"winmm.lib")

const char* Bin(DWORD n)
{
    static char buf[33];
    int i;
    for(i=0;i<sizeof(DWORD)*8;i++)
        buf[i] = '0'+((n>>i)&1);
    buf[32] = '\0';
    return buf;
}

void Afficher(unsigned int id,const JOYINFOEX* j)
{
    printf("Joystick : #%d\n",id);
    printf("Axe XY : %6d ; %6d\n",j->dwXpos,j->dwYpos);
    printf("Axe ZR : %6d ; %6d\n",j->dwZpos,j->dwRpos);
    printf("Axe UV : %6d ; %6d\n",j->dwUpos,j->dwVpos);
    printf("Point of view : %.2f    \n",j->dwPOV/100.f);
    printf("Boutons (x %2d) : %s\n",j->dwButtonNumber,Bin(j->dwButtons));
}

int main()
{
    unsigned int maxGamepadId = joyGetNumDevs();
    unsigned int id;
    JOYINFOEX joyInfoEx;
    ZeroMemory(&joyInfoEx, sizeof(joyInfoEx));
    joyInfoEx.dwSize = sizeof(joyInfoEx);
    joyInfoEx.dwFlags = JOY_RETURNALL;
    while(1)
    {
        HANDLE H=GetStdHandle(STD_OUTPUT_HANDLE);
        COORD C;
        C.X = 0;
        C.Y = 0;
        SetConsoleCursorPosition(H,C);  // pour remettre le curseur en haut
        printf("Joysticks : max = %d\n",maxGamepadId);
        for (id = 0; id < maxGamepadId; ++id) 
        {
            MMRESULT result = joyGetPosEx(id, &joyInfoEx);
            if (result!=JOYERR_NOERROR)
                continue;
            Afficher(id,&joyInfoEx);
        }
        Sleep(10);
    }
    return 0;
}




Commentaires

	Voici comment tester un jostick ou un joypad sous Windows.
	Branchez un joystic ou un joypad.

	Lancez le programme, vous pourrez le tester : appyez sur les boutons, testez les parties analogiques, vous voyez évoluer vos appuis.

	Voici comment ça marche : 
	joyGetNumDevs vous donne le nombre maximum de joysticks possibles gérés. Chez moi 16. 
	(Je me demande si un jour je jouerai sur un PC avec 15 potes et 16 josticks...)

	Prenez une structure JOYINFOEX, mettez tout à zero, remplissez le champ de la taille de la structure joyInfoEx.dwSize = sizeof(joyInfoEx);
	ainsi que le champ joyInfoEx.dwFlags = JOY_RETURNALL; qui veut dire : je veux tout récupérer.

	Ensuite, c'est simple, la fonction joyGetPosEx remplit la structure de l'état total de votre i_ieme joystick.

	Ma fonction Afficher affiche tout cela :

	Les axes analogiques varient de 0 à 65535. 32767 (environ) est la position milieu.
	Souvent dans les jeux, on considère qu'on est au milieu si on est autour de 32767, par exemple entre 30000 et 34000 ....

	Les boutons, vous voyez aussi tous les boutons dans un masque binaire.

	Le POV est appelé Point of view : c'est la croix directionnelle. Elle indique un angle : 0°, 90°, 180°, 270° ainsi que les diagonales.
	le nombre donné est 100 fois l'angle en degrés, donc entre 0 et 35999

	Or si vous ne touchez pas la croix, alors la valeur donnée est hors limite : chez moi 655.35

	Il suffira donc de se dire que si on dépasse 360°, alors la croix est au repos, sinon, on a l'angle.