French Chinese (Simplified) Dutch English German Greek Italian Japanese Korean Spanish

     

 



 

 

Big Tuto SFML 2 : Rabidja v. 3.0

Chapitre 11 : Ajoutons une manette !

Tutoriel présenté par : Jérémie F. Bellanger (Jay81)
Date d'écriture : 19 février 2015
Date de révision : 20 juin 2016

      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 ! wink

   Mais, j'aurais pu m'arrêter simplement à la détection de la manette, et voilà ! angel
   Sauf que souvent, on lance le programme sans la manette, et on se dit : "Mince, la manette ! surprise " 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 ! indecision ).

   On va donc essayer de créer un système plus pro qui détecte les manettes (ou leur absence) on the go ! wink

   Sinon, j'ai aussi réussi à gérer en même temps le D-PAD et le thumbpad de la manette Xbox 360 (car c'est avec cette manette, devenue plus ou moins standard que j'ai programmé ce tuto - vous pourrez cependant en essayer d'autres, mais il faudra certainement adapter le mapping des touches wink).

   J'ai donc créé un système avancé de détection : comme on ne peut pas utiliser le D-PAD et le thumbpad en même temps, à moins d'être un martien avec 4 mains laugh , l'utilisation du D-PAD désactive le thumbpad (pour éviter les conflits wink ). Il suffit alors de lâcher le D-PAD et d'utiliser le thumbpad pour le réactiver en 1/60ème de seconde (soit un tour de boucle, c'est important pour la réactivité cheeky ) ! Du coup, l'utilisateur lambda ne s'en rendra jamais compte, il se dira simplement que sa manette Xbox 360 marche correctement (et c'est le but laugh ).   

   Et voilà, donc on est parti !

 

 

      Le code

   On va commencer par aller dans le fichier input.h, pour créer un nouveau boolée DPADinUse et une nouvelle constante DEAD_ZONE wink.

   DPADinUse nous permettra de savoir si le joueur utilise le DPAD ou le thumbpad de la manette.

   DEAD_ZONE permettra, quant à elle, de définir la dead zone du thumbpad de notre manette, d'où son nom laugh. 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. wink

 

Fichier : input.h : Rajoutez :

bool DPADinUse;
 
/*******************/
/* 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. wink 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. angel

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

   Je l'ai déjà pas mal commentée, donc je vous laisse la lire. smiley

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 le D-PAD bouge, on l'active,
case Event::JoystickMoved:
if (event.joystickMove.axis == sf::Joystick::PovX || event.joystickMove.axis == sf::Joystick::PovY)
DPADinUse = true;
//Sinon, si le thumbpad bouge, c'est lui qu'on active.
else if (event.joystickMove.axis == sf::Joystick::X || event.joystickMove.axis == sf::Joystick::Y)
DPADinUse = false;
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.jump = true;
break;
 
case 2:
button.attack = 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.jump = false;
break;
 
case 7:
button.enter = false;
break;
 
default:
break;
}
break;
 
// On ne traite pas les autres types d'évènements
default:
break;
}
}
 
 
if (!DPADinUse)
{
/*** THUMBPAD ***/
//Test de l'axe des X
//Si sa valeur est négative, on va à gauche
if (Joystick::getAxisPosition(0, Joystick::X) < -DEAD_ZONE)
{
button.right = false;
button.left = true;
}
//Sinon, on va à droite
else if (Joystick::getAxisPosition(0, Joystick::X) > 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::Y) < -DEAD_ZONE)
{
button.up = true;
button.down = false;
}
//Sinon, on va en haut
else if (Joystick::getAxisPosition(0, sf::Joystick::Y) > DEAD_ZONE)
{
button.up = false;
button.down = true;
}
//On ne fait rien, s'il n'y a pas d'appui
else
{
button.up = false;
button.down = false;
}
}
else
{
/*** 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 wink).

   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. smiley

  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. cool  :

 

  Pour le thumbpad, tout comme 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é.

   Mais là, où le problème arrive, c'est que sans l'utilisation de notre variable DPADinUse, il y aurait conflit entre le D-PAD et le thumbpad, le thumbpad remettant les inputs à false, alors qu'il y a parfois appui sur une touche du D-PAD et vice-versa. C'est pourquoi, on met DPADinUse à true dès qu'on détecte un appui sur une touche du D-PAD et à false si c'est le thumbpad qu'on utilise. En fonction de cette variable, on gère ensuite soit le D-PAD soit le thumbpadwink

   Ainsi, le joueur peut passer de l'un à l'autre librement, n'importe quand, et ça fait quand même plus pro ! wink

   Bien, il ne nous reste plus qu'à mettre à jour nos prototypes, comme d'habitude :

 

Fichier : input.h : Rajoutez :

void getJoystick(sf::RenderWindow &window);

   Voilà, plus qu'à compiler et à lancer le programme ! wink   

   Vous pouvez maintenant profiter de votre jeu de plateformes avec votre manette préférée ! cool

   Elle est pas belle, la vie ?! cool

   Je vous dis donc à bientôt pour le chapitre 12 ! angel

                                                                            Jay 

 

Abonnez-vous et devenez Premium pour lire la fin de ce tuto ainsi que tous les autres tutos du site !

 

 

   Et voici maintenant la liste des chapitres suivants, de ce tuto, auxquels vous aurez accès :

- Big Tuto SFML 2 - Chapitre 12 : Ajoutons des monstres !
- Big Tuto SFML 2 - Chapitre 13 : Affichons le HUD !
- Big Tuto SFML 2 - Chapitre 14 : Monte le son !
- Big Tuto SFML 2 - Chapitre 15 : Power-ups et tiles spéciales !
- Big Tuto SFML 2 - Chapitre 16 : Des plateformes volantes !
- Big Tuto SFML 2 - Chapitre 17 : Niveaux et checkpoints !
- Big Tuto SFML 2 - Chapitre 18 : Ajoutons des menus !
- Big Tuto SFML 2 - Chapitre 19 : Ajoutons des shurikens !
- Big Tuto SFML 2 - Chapitre 20 : Ajoutons des explosions !
- Big Tuto SFML 2 - Annexe 1: Ajoutons des ombres
- Big Tuto SFML 2 - Annexe 2: Ajoutons des lumières !
- Big Tuto SFML 2 - Annexe 3: Des tiles lumières !
- Big Tuto SFML 2 - Annexe 4: Soyons flous !
- Big Tuto SFML 2 - Annexe 5: Collisions lumineuses (1)
- Big Tuto SFML 2 - Annexe 6: Collisions lumineuses (2) 

 

Et voilà le résultat final auquel vous parviendrez à la fin de ce Tuto !

 

   @ bientôt ! wink

                Jay

 

 

Commentaires   

0 #1 Sisyphe 27-11-2015 21:56
bonjour, s'il vous plait j'aimes bien vos tuto et je me demandais a quand est pervue la suite de ce big tuto??
+1 #2 jay81 28-11-2015 07:26
Bonjour, regarde sur la page d'accueil : le tuto est terminé et accessible en entier dès maintenant aux membres Premium (pour 12E / an). Sinon, il est publié pour les autres au rythme d'un chapitre par mois ;) . @+ :)
0 #3 janpin 01-02-2018 09:57
Bonjour,
Malgré avoir rempli les 625 cases du formulaire d'abonnement ce *$!^£..% de machin ne veut toujours pas m'accepter... :sad: .Maître que fais-je?
0 #4 jay81 01-02-2018 10:42
Bonjour ;)

Malheureusement, c'est un problème récurrent avec les données synchronisées des navigateurs. Je suis forcé de monter les réglages du pare-feu au maximum pour éviter les tentatives de piratage et cela crée des faux-positifs avec les données périmées que stockent les navigateurs en cache... :(

Mais il existe une solution simple, expliquée dans "Problèmes de Connexion" : il suffit de vider le cache du navigateur utilisé et en général cela fonctionne à nouveau. :lol:

Si toutefois cela ne fonctionnait pas encore, il est aussi possible de faire un don via Paypal de 20€ en précisant bien le nom, l'e-mail et le pseudo et je rentrerai l'abonnement manuellement (avec un petit dédommagement vu les difficultés rencontrées). ;)

Désolé pour ces désagréments.

Connectez-vous ou inscrivez-vous pour pouvoir poster.