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 |
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)