Afficher un message
Vieux 12/10/2010, 18h43   #6 (permalink)
Profil
Wolfi
Membre
Ancienneté  80%
Ancienneté 80%
 
Date d'inscription: mai 2006
Localisation: Rouen
Âge: 36
Pays :
Messages: 675
Téléchargements: 0
Uploads: 0
Merci: 1
Remercié 14 fois dans 7 Posts
Envoyer un message via ICQ à Wolfi Envoyer un message via AIM à Wolfi
Par défaut

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:

Citation:
cellPadEnd();
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
__________________
le loup est un loup pour le loup

Nintendo: N64, NGC
Sega: Dreamcast
Sony: PSP, PS3

Dernière modification par Wolfi ; 12/10/2010 à 18h54.
Wolfi est déconnecté   Réponse avec citation