Utilisation d'un joystick/joypad en C# sous Windows

Proposé par Agar

le 03 November 2006 à 17h 22mn 49s

7459 visualisations




    /*
     * TUTORIAL: Utilisation d'un Joystick/Joypad en C#
     *
     * Ecrit par Ambroise Garel (agar@cafedefaune.com) pour Irrlicht.fr
     *
     * Irrlicht n'a pas beaucoup de défauts, mais son absence de fonctions permettant l'usage d'un
     * joystick en est un.
     *
     * Bien évidemment, on peut utiliser DirectInput, mais il existe un moyen bien plus simple de
     * lire les coordonnées et les boutons d'un controleur de jeu sous Windows.
     *
     * Cette petite classe fait tout le travail pour vous.
     *
     * */



    // Important: pour l'appel à des DLLs contenant du code non managé.

    using System.Runtime.InteropServices;

    public class JoystickReader
    {
        [DllImport("winmm.dll")]
        private static extern int joyGetPos(int uJoyID, ref JOYINFO pji);

        private const int MAXJOYBUTTONS = 16;

        private int joystick_id;

        private struct JOYINFO
        {
            public int wXpos;
            public int wYpos;
            public int wZpos;
            public int wButtons;
        }


        // Constructeur: passez en paramètre l'ID du joystick dont vous souhaitez lire les informations.
        // Si vous n'avez qu'un seul joystick, c'est pas compliqué, son ID est zéro.
        // Sinon, vous devrez expérimenter : ça commence à 0 et ça finit à "nombre de joysticks - 1"

        public JoystickReader(int joyid) { joystick_id = joyid; }



        // Fonction GetJoy, à appeler dans la boucle principale de votre programme, en lui passant
        // en paramètres 4 valeurs:
        // - Un tableau (d'une seule dimension) de booléens, qui vous dira si tel ou tel bouton est
        //   appuyé (true) ou relaché (false)
        // - Trois entiers, les axes X, Y et Z du joystick.
        //     Si votre joystick est "au repos" (centré) sur un axe, la valeur sera 32767.
        //     Si le joy est poussé à fond dans une direction, vous aurez 0 ou 65535 (selon le sens).
        //       * Avec un controleur analogique (comme un joystick),
        //         toutes les valeurs intermédiaires sont possibles.
        //       * Avec un controleur digital (comme un joypad de base),
        //         les valeurs sont toujours 0, 32767 ou 65535 (il n'y a pas d'intermédiaire)
        //
        // La fonction retourne "true" si ça c'est bien passé, "false" s'il y a eu un problème
        // (par exemple s'il n'y a pas de joystick répondant à cette ID).

        public bool GetJoy(out bool[] joybuttons, out int axis_x, out int axis_y, out int axis_z)
        {
            JOYINFO JoyInformation = new JOYINFO();

            joybuttons = new bool[MAXJOYBUTTONS];

            if (joyGetPos(joystick_id, ref JoyInformation) != 0)
            {
                axis_x = 0;
                axis_y = 0;
                axis_z = 0;
                return false;
            }

            for (int i = 0; i < MAXJOYBUTTONS; i++)
                joybuttons[i] = (((int)Math.Pow(2, i) & JoyInformation.wButtons) != 0);

            axis_x = JoyInformation.wXpos;
            axis_y = JoyInformation.wYpos;
            axis_z = JoyInformation.wZpos;

            return true;
        }
    }


#1 

03-11-2006 17:37:48

Copland
Modérateur
Lieu: ZarbiLand
Date d'inscription: 22-09-2006
Messages: 657
Site web

Un code vraiment utile !!!
Merci beaucoup pour cette deuxième contribution smile.


Config : I5 2400, ATI HD6870 1Go DDR5, 4Go DDR3.
Single Boot : Windows Seven.

Hors ligne


#2 

04-11-2006 12:09:45

kedu
Modérateur
Date d'inscription: 23-09-2006
Messages: 155

Merci beaucoup !!

Disons que c'est tellement pratique et facile à intégrer que c'est le genre de chose à mettre toute suite dans une librairie perso...

On peut ? ^^

Hors ligne


#3 

05-11-2006 01:10:29

Agar
Membre
Date d'inscription: 01-11-2006
Messages: 16

kedu :

C'est tellement pratique et facile à intégrer que c'est le genre de chose à mettre toute suite dans une librairie perso...
On peut ? ^^


Vous voulez faire quoi exactement? Créer une librairie de fonctions téléchargeable depuis ce site?

Si c'est le cas, c'est une excellente idée. N'hésitez pas à y inclure mon code.

Hors ligne


#4 

05-11-2006 01:36:28

kedu
Modérateur
Date d'inscription: 23-09-2006
Messages: 155

Merci !!

Oui effectivement on exclut pas d'entreprendre ce genre de chose à long terme... (quelques projets avant ^^)

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
883 membres
1429 sujets
11121 messages
Dernier membre inscrit: Saidov17
74 invités en ligne
Aucun membre connecté
RSS Feed