UTILISER LES CONTROLLEURS

 

Quel est l'interêt d'un jeu si vous ne pouvez pas interagir avec ?
Ca revient au même que de regarder une vidéo :))
De plus un bon jeu se caractérise par sa capacité à gérer les réactions sur le(s) controlleur(s) de la part du ou des joueurs.

Résumé

Pendant le balayage vertical de l'écran, l'état des controlleurs est lu par l'intermédiaire des buffers systèmes ( resp. sprites dans les buffers vidéo... ) et est utilisé dans votre jeu.
L'état des controlleurs inclut si OUI ou NON le controlleur est présent, le type de controlleur present, et bien sur quels boutons ont été pressés et la position du joystick si il y en a.

 

Comprendre les buffers système

Les buffers système peuvent contenir jusqu'à 34 octets d'informations contenant l'état des controlleurs.


                                                          

Octets
Informations
0
Le controlleur est connecté (0x00) ou pas (0xFF)
1
4 LSB ( less strong bits , c.a.d les 4 bits de droite) -> la moitié du nombre d'octets de données reçu.
4 MSB ( most strong bits, c.a.d les 4 bits de gauche ) -> type de controlleur.
2-33
Données reçues



 

Grâce à ce tableau vous avez remarqué que les 4 bits de poids faible de l'octet 1 contiennent un nombre identifiant le type de controlleur connecté :

 

Type du controlleur
nombre indentifiant le controlleur dans l'octet 1 ( en héxadécimal )
Controlleur standard
0x4
Controlleur avnalogique avec dual shock
0x4 (mode off)      0x7 (mode on)
Controlleur analogique standard
0x4 (mode off )     0x5 (mode on)
NeGcon
0x2
GunCon
0x6
Mouse
0x1




Malheureusement il n'est actuellement pas possible d'utilisé le système de retour de force (dual shock), Sony n' ayant pas diffusé ses librairies.

Pour le controlleur standard et le controlleur analogique, les octets 2 et 3 contiennent les informations concernant l'état des boutons (pressés ou relachés).
De plus pour le controlleur analogique les octets 4, 5, 6, 7 contiennent les informations sur la position des joysticks analogiques.

Le tableau suivant récapitule cela :

Type du controlleur
Octets
Informations
Controlleur standard & Controlleur standard analogique
2-3
Etats des différents boutons
Controleur standard analogique
4-5-6-7

Position des joysticks analogique

4 : Joy. droit pos. horyzontale.
5 : Joy. droit pos. verticale.
6: Joy. gauche pos. horyzontale.
7: Joy. gauche pos. verticale.



les valeurs des octets correspondant à un bouton ou à une position sont précisées dans le guide de l'utilisateur.

Juste une précision : - une valeur de 0 pour la position verticale représente le haut du joystick s'incrémentant jusqu'à 255 pour le bas du joystick.
                               - une valeur de 0 pour la position horyzontale représente la gauche du joystick s'incrémentant jusqu'à 255 pour la droite du joystick.



Lire les données reçues

Bizrarrement, une valeur de bit de 1 indique que le bouton n'est pas pressé alors que une valeur de bit de 0 indique que le bouton est pressé.
Aussi pour plus de simplicité nous inverserons les valeurs de bits grace à l'operateur binaire "~" qui signifie NON en binaire:   ~0 = 1
                                                                                                                                                                                            ~1 = 0

 Pour extraire les octets 2 et 3 afin d'occuper une seule variable nous incluerons les lignes suivantes dans notre programme :

                int padstate = ~(*(bb0 + 3) | *(bb0 + 2)<< 8);


Quelques explications sont nécessaires :
                                                                     -
l'opérateur | est le OU binaire
                                                                     - bb0 est le pointeur sur le controlleur
                                                                     - l'opérateur permet de convertir des données d' octets en entier.

Pour savoir quel bouton est appuyé, nous utilisons les bits de masquage correspondant au bouton. Ces bits sont définis dans le fichier PAD.H.
La technique est la suivante :
                                            
                                               if (padstate & PADStart)
                                              {
                                                   //le bouton start est pressé 
                                                   //instructions appropriées 

                                               }


Recommandations

Malheureusement connaitre le(s) bouton(s) pressé(s) et la position du joystick ne suffit pas. Supposer que pendant le jeu vous otez le controlleur.
Votre programme continuera à lire les dernières valeurs des positions du joystick et des boutons pressés. Votre jeu se comportera alors comme si le controlleur est encore connecté.
Pour répondre à ces problèmes le GAQ (groupe d'assurance qualité), qui teste les jeux, ont dressés une liste des points à suivre concernant la gestion des controlleurs.
Ces informations peuvent etre trouvés sur la page web périphérique du site des membres YAROZE.

Nous pouvons résumer ces préconditions requises :

                             if (padConnected)
                                 if (padSupported)
                                    //exécuter les instructions
                                 else
                                    //ignorer les instructions  
                             else
                                   //pas d'instrcutions

L'auteur initiale de ce document en version anglaise a produit ses propres fichiers PAD.H et PAD.C. Vous pouvez les téléchargés ici (pad.zip)            

 

retour à l'index