
Big Tuto SFML 2 / Action-RPG : Legends of Meruvia
Chapitre 10 : Ajoutons une manette !
Tutoriel présenté par : Jérémie F. Bellanger (Jay81)
Date d'écriture : 31 mai 2016
Date de révision : -
Prologue
Dans ce nouveau chapitre, nous allons voir comment ajouter le support d'une manette à notre jeu, car c'est quand même plus sympa pour jouer!
Mais, j'aurais pu m'arrêter simplement à la détection de la manette, et voilà ! 
Sauf que souvent, on lance le programme sans la manette, et on se dit : "Mince, la manette !
" et on la branche. Et là, on s'attend à ce que le programme la détecte et qu'on puisse jouer avec, sans avoir rien à faire (et surtout pas à relancer le programme !
).
On va donc essayer de créer un système plus pro qui détecte les manettes (ou leur absence) on the go ! 
Et voilà, donc on est parti !
Le code
On va commencer par aller dans le fichier input.h, pour créer une nouvelle constante DEAD_ZONE
.
DEAD_ZONE permettra, quant à elle, de définir la dead zone du thumbpad de notre manette, d'où son nom
. Effectivement, le thumbpad n'est jamais réellement à 0. Même au repos, il dévie un peu. On va donc mettre en place une deadzone dans laquelle, on va considérer que le gamepad est au repos. On va prendre comme valeur 20 / 100, mais vous pouvez la changer. ![]()
Pour une raison qui m'échappe, je n'ai pas réussi à gérer le thumbpad de la manette Xbox 360 avec la nouvelle version de la SFML. Apparemment, l'API des joysticks aurait été revue, et c'est sans doute un dommage collatéral...
Je réessaierais plus tard.
Si toutefois, vous en avez vraiment besoin, vous pouvez utiliser la version de la SFML utilisée dans le Big Tuto Rabidja SFML, et recopier le code, plus complet, du chapitre 11. Cela devrait fonctionner tel quel. ![]()
Fichier : input.h : Rajoutez :
|
/*******************/
/* Constantes */
/******************/
//Dead zone de la manette pour éviter les mouvements involontaires
//Les valeurs de la SFML2 vont de 0 à 100 : il faut donc presser
//le stick au moins à 20% pour bouger.
const int DEAD_ZONE = 20;
|
Fonction d'auto-détection
Voilà, maintenant, il nous faut faire appel à notre future fonction getjoystick() à la place du clavier, si une manette est connectée.
Pour cela, on va mettre à jour notre fonction gestionInputs().
Celle-ci va être très simple : elle va détecter si une manette est connectée. Si c'est le cas, elle va appeler getJoystick(), sinon elle appellera getInput(). Comme ça, si on branche / débranche notre manette, on pourra toujours continuer à jouer. ![]()
Voici le code commenté, que je vous laisse lire :
Fichier : input.cpp : Remplacez la fonction précédente par :
|
//Fonctions
void Input::gestionInputs(RenderWindow &window)
{
if (sf::Joystick::isConnected(0))
getJoystick(window);
else
getInput(window);
}
|
Passons maintenant aux choses sérieuses, au nerf de la guerre, avec la fonction getjoystick() ! ![]()
Je l'ai déjà pas mal commentée, donc je vous laisse la lire. ![]()
Fichier : input.cpp : Ajoutez la fonction :
|
void Input::getJoystick(RenderWindow &window)
{
// Tant qu'il y a des évènements à traiter...
while (window.pollEvent(event))
{
// On regarde le type de l'évènement...
switch (event.type)
{
// On ferme la fenêtre
case Event::Closed:
window.close();
break;
//On presse la touche Escape pour quitter
case Event::KeyPressed:
if (event.key.code == Keyboard::Escape)
window.close();
break;
//Si on presse un bouton du joystick
case Event::JoystickButtonPressed:
switch (event.joystickButton.button)
{
//Suivant le numéro de la touche, on met à jour nos inputs
//(voir la carte de mapping de la manette Xbox 360).
//Suivant votre manette, il faudra sans doute adapter ces valeurs
case 6:
window.close();
break;
case 0:
button.attack = true;
break;
case 1:
button.magie = true;
break;
case 2:
button.run = true;
break;
case 7:
button.enter = true;
break;
default:
break;
}
break;
// Idem si on relâche un bouton de la manette
case Event::JoystickButtonReleased:
switch (event.joystickButton.button)
{
case 0:
button.attack = false;
break;
case 1:
button.magie = false;
break;
case 2:
button.run = false;
break;
case 7:
button.enter = false;
break;
default:
break;
}
break;
// On ne traite pas les autres types d'évènements
default:
break;
}
}
//On traite le bouton de course X (2) à part
if (sf::Joystick::isButtonPressed(0, 2))
button.run = true;
else
button.run = false;
/*** D-PAD ***/
//Test de l'axe des X
//Si sa valeur est négative, on va à gauche
if (Joystick::getAxisPosition(0, Joystick::PovX) < -DEAD_ZONE)
{
button.right = false;
button.left = true;
}
//Sinon, on va à droite
else if (Joystick::getAxisPosition(0, Joystick::PovX) > DEAD_ZONE)
{
button.right = true;
button.left = false;
}
//On ne fait rien, s'il n'y a pas d'appui
else
{
button.right = false;
button.left = false;
}
//Test de l'axe des Y
//Si sa valeur est négative, on va en bas
if (Joystick::getAxisPosition(0, sf::Joystick::PovY) < -DEAD_ZONE)
{
button.up = false;
button.down = true;
}
//Sinon, on va en haut
else if (Joystick::getAxisPosition(0, sf::Joystick::PovY) > DEAD_ZONE)
{
button.up = true;
button.down = false;
}
//On ne fait rien, s'il n'y a pas d'appui
else
{
button.up = false;
button.down = false;
}
}
|
Bon, vous remarquerez que pour l'essentiel, la boucle des events ressemble à celle du clavier (avec des if au lieu des case, car c'est plus simple ici
).
Pour tout ce qui est boutons, il s'agit de regarder s'ils sont enfoncés ou non, et dans ce cas de changer la valeur de notre struct Button, un peu comme pour le clavier. ![]()
Le mapping des touches concerne la manette Xbox 360 de Microsoft (dont vous trouverez le schéma ci-dessous). Si vous voulez tester une autre manette, il vous suffira de changer la valeur des touches, selon votre manette. ![]()
:

Pour le D-PAD, il s'agit de voir s'il y a eu un mouvement sur l'un de ses axes (X / POVX - gauche/droite ou Y / POVY - haut/bas) et si ce mouvement sort de notre deadzone.
S'il n'y a pas de mouvement, tous les inputs reviennent à false, et sinon, on passe à true l'axe du stick poussé.
Fichier : input.h : Rajoutez :
|
void getJoystick(sf::RenderWindow &window);
|
Voilà, plus qu'à compiler et à lancer le programme !
Vous pouvez maintenant profiter de votre jeu de plateformes avec votre manette préférée ! ![]()
Elle est pas belle, la vie ?! ![]()

@ bientôt pour la suite ! ![]()
Jay.

English
Français 