Clavier, souris et joysticks
Introduction
Ce tutoriel explique comment accéder aux entrées globales : clavier, souris et joysticks. Ces fonctionnalités ne sont en aucun cas à confondre avec les évènements : les entrées temps-réel vous permettent de vérifier l'état courant du clavier, de la souris et des joysticks à n'importe quel moment ("est-ce que ce bouton est actuellement pressé ?", "où se trouve la souris ?"), alors que les évènements vous préviennent lorsque quelque chose change ("ce bouton a été pressé", "la souris a bougé").
Le clavier
La classe qui donne accès à l'état du clavier est sf::Keyboard
. Elle contient une unique fonction, isKeyPressed
,
qui donne l'état courant d'une touche (appuyée ou relâchée). C'est une fonction statique, vous n'avez pas besoin d'instancier
sf::Keyboard
pour l'utiliser.
Cette fonction lit directement l'état du clavier, sans chercher à savoir si votre fenêtre a le focus ou non. Cela signifie que isKeyPressed
peut renvoyer true
même si votre fenêtre est inactive.
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
{
// la touche "flèche gauche" est enfoncée : on bouge le personnage
character.move(1.f, 0.f);
}
Les codes de touches sont définis dans l'enum sf::Keyboard::Key
.
Certaines touches peuvent manquer, ou être interprétées de manière incorrecte selon votre OS et l'agencement de votre clavier. C'est un aspect qui fera l'objet d'améliorations dans une future version de SFML.
La souris
La classe qui donne accès à l'état de la souris est sf::Mouse
. Comme son copain sf::Keyboard
, elle ne contient
que des fonctions statiques et n'est pas censée être instanciée (SFML gère une souris unique pour le moment).
Vous pouvez vérifier si un bouton est pressé :
if (sf::Mouse::isButtonPressed(sf::Mouse::Left))
{
// le bouton gauche est enfoncé : on tire
gun.fire();
}
Les codes de boutons sont définis dans l'enum sf::Mouse::Button
. SFML supporte jusqu'à 5 boutons : gauche, droit, milieu (molette),
plus deux autres boutons peu importe ce qu'ils représentent.
Vous pouvez aussi récupérer ou changer la position courante de la souris, relativement au bureau ou à une fenêtre particulière.
// on lit la position globale de la souris (relativement au bureau)
sf::Vector2i globalPosition = sf::Mouse::getPosition();
// on lit la position locale de la souris (relativement à une fenêtre)
sf::Vector2i localPosition = sf::Mouse::getPosition(window); // window est un sf::Window
// on change la position globale de la souris (relativement au bureau)
sf::Mouse::setPosition(sf::Vector2i(10, 50));
// on change la position locale de la souris (relativement à une fenêtre)
sf::Mouse::setPosition(sf::Vector2i(10, 50), window); // window est un sf::Window
Il n'y a pas de fonction pour récupérer l'état de la molette. En effet, celle-ci n'effectue que des mouvements relatifs et n'a pas d'état absolu.
En regardant une touche du clavier on peut dire si elle est enfoncée ou relâchée ; en regardant le curseur de la souris on peut dire où il se
trouve à l'écran ; mais en regardant la molette de la souris on ne peut pas savoir sur quel "cran" elle se trouve. On peut uniquement savoir
quand elle bouge (évènement MouseWheelScrolled
).
Les joysticks
La classe qui donne accès à l'état des joysticks est sf::Joystick
. Comme les autres classes de ce tutoriel, elle ne contient que
des fonctions statiques.
Les joysticks sont identifiés par leur numéro (de 0 à 7, puisque SFML supporte jusqu'à 8 joysticks). Ainsi, le premier paramètre de toutes les
fonctions de sf::Joystick
est le numéro du joystick dont vous voulez lire l'état.
Vous pouvez vérifier si un joystick est connecté ou non :
if (sf::Joystick::isConnected(0))
{
// le joystick numéro 0 est connecté
...
}
Vous pouvez aussi récupérer les capacités d'un joystick connecté :
// combien de boutons le joystick numéro 0 a-t-il ?
unsigned int buttonCount = sf::Joystick::getButtonCount(0);
// est-ce que le joystick numéro 0 possède un axe Z ?
bool hasZ = sf::Joystick::hasAxis(0, sf::Joystick::Z);
Les axes de joysticks sont définis dans l'enum sf::Joystick::Axis
. Etant donné qu'ils n'ont aucune signification particulière,
les boutons sont quant à eux simplement numérotés de 0 à 31.
Enfin, vous pouvez bien entendu récupérer l'état des boutons et des axes d'un joystick :
// est-ce que le bouton 1 du joystick numéro 0 est enfoncé ?
if (sf::Joystick::isButtonPressed(0, 1))
{
// oui : on shoot !!
gun.fire();
}
// quelle est la position actuelle des axes X et Y du joystick numéro 0 ?
float x = sf::Joystick::getAxisPosition(0, sf::Joystick::X);
float y = sf::Joystick::getAxisPosition(0, sf::Joystick::Y);
character.move(x, y);
L'état des joysticks est automatiquement mis à jour par la boucle d'évènements. Si vous n'en avez pas, ou si vous voulez vérifier l'état d'un joystick
(par exemple, voir quels joysticks sont connectés) avant de lancer votre boucle de jeu, vous devrez appeler la fonction sf::Joystick::update()
afin d'être sûr que l'état des joysticks est à jour.