Comme promis, voila un deuxième tuto pour comprendre le fonctionnement de la librairie libpad, gérant la manette de la PS3.
Première partie - Initialiser la librairie
Comme pour toutes les librairie (qui sont des prx chargés automatiquement au lancement d'un programme linké statiquement avec une librairie stub) il faut l'initialiser:
Citation:
if (cellPadInit(7) == CELL_OK){
padInitialized = true;
}
|
Cette fois-ci, c'est très simple, il suffit d'appeler cette fonction, avec en argument le nombre maximal de pad que l'on veut gérer (entre 1 et 7).
Deuxieme partie - Obtention des informations de la manette
Il y a plusieurs choses à savoir pour utiliser la manette. Déja, plusieurs types de
manettes sont disponibles, la sixaxis simple, la dualshock 3 et meme des manette sans pression analogique des boutons (type PS1, soit c'est appuyé, soit ça ne l'est pas, impossible de savoir à quel point).
Ensuite, ou et quand demander les informations: dans la boucle principale, avant ou après le dessin, et a chaque passage dans la boucle il faudra mettre à jour ces informations.
Passons au code, que j'ai simplifié pour la bonne compréhension:
Citation:
CellPadData padData;
cellPadGetData (0, &padData);
|
cellPadGetData a comme premier argument le numéro de la manette que l'on veut observer, ici 0, et comme second argument une structure à deux champs, len et buttons, et cette structure sera remplie pendant l'appel de la fonction avec les informations de la manette.
Le champ len est très important, il permet de savoir exactement à quel type de manette on a affaire, au lieu d'utiliser les methodes spécialisées pour cela, même si ce n'est pas le but premier. len donne en fait la taille du tableau buttons, qui selon sa taille contient des information de pression des boutons, de degré de pression, puis de mouvement du pad. Ce qui va nous interesser ici, c'est de savoir si le bouton "CROIX" est appuyé: on doit donc tester si len est supérieur à 0 (sinon la manette n'est pas encore disponible), et ensuite verifier si le troisième élément du tableau peut être masqué par la valeur du bouton CROIX:
Citation:
if(padData.len > 0) { //Longueur inf ou égale à zero -> manette déconnectée
if (padData.buttons[3] & CELL_PAD_CTRL_CROSS) { // On teste avec le masque du bouton croix, les masques étant toujours: CELL_PAD_CTRL_*nom du bouton*
// Le bouton croix a été appuyé, on réagit en conséquence.
}
}
|
Troisieme partie - Fermer la librairie
Pour fermer la librairie, après la boucle principale il suffit d'executer:
Voila, c'est tout pour le polling de manette, qui est plutot simple, et il est bien possible que la gestion du clavier et de la souris le soit tout autant.
Enfin, pour completer avec un exemple concret, pour ceux qui voudrait voir comment on peut coder ça en C++ et pas en impératif basique (avec aussi un superbe Makefile très inspiré de celui de l'open backup manager, qui la a bien géré) je vous joint un petit programme à compiler vous-meme (puisque distribuer des pkg semble interdit), c'est une grille moche qui tourne (exemple du SDK) à laquelle j'ai ajouté la possibilité de stopper avec START et faire changer de direction de rotation avec les fleches gauche et droite, le tout refait en vrai C++ . Petite note pour la compilation, je n'ai pas réussi a desactiver la levée d'exception dans la STL donc vous aurez à commenter la ligne qui rejette une erreur dans l'header de l'objet list de la STL du SDK (si quelqu'un a une idée à ce propos ...)
http://rapidshare.com/files/424639848/PS3Library.zip