Académique Documents
Professionnel Documents
Culture Documents
Gérer le clavier
Projet de démo
Introduction
Avertissement
Appui continu
Appui simple
Gérer la souris
Projet de démo
Coordonnées
Clic continu
Clic simple
Gérer le joystick
Détecter sa présence
Lire les valeurs des boutons
Lire les valeurs du stick analogique
Gérer le clavier
Projet de démo
📁 Voir le projet de démo (dans le dossier "Clavier")
Introduction
Ce qui est important de comprendre, pour gérer correctement le clavier, c'est qu'on a 2 cas
de figure :
- On veut détecter qu'une touche est enfoncée "en continu" par exemple pour gérer un
déplacement via les touches de directions. Cela signifie que tant qu'on appuie sur la
touche en question (maintient enfoncé), il se passe quelque chose. Clair ?
- On veut détecter qu'une touche a été pressée, et ne réagir qu'une seule fois ! Par
exemple "Touche I pour inventaire" (et globalement toutes les touches de menu ou
d'options dans un jeu) ou encore le tir, si on veut un seul tir à la fois et obliger le
joueur à relâcher la touche et la re-enfoncer pour avoir un 2ème tir.
Avertissement
Pour avoir un code propre et maintenable, il faut séparer la logique de l'affichage.
Je ne veux donc pas voir de tests du clavier, de la souris ou du joystick, dans la fonction
système love.draw !
Imaginez que vous voulez gérer la pause dans un jeu… Si vous avez mis des tests de
clavier partout, et donc dans le draw, vous ne vous en sortirez pas ! Même en pause le
joueur pourra continuer à interagir avec le jeu.
Alors que si tout est dans l'update, il suffit de ne pas exécuter le code de gameplay si la
pause est active (via un simple "if"). L'affichage lui, sera figé. Comme une vrai pause quoi !
Appui continu
Pour gérer l'appui continu c'est assez simple :
function love.update(dt)
if love.keyboard.isDown("right") then
hero.x = hero.x + 10*dt
end
end
Ici c'est la touche "flèche droite" qui est testée. On passe donc la constante "right" à la
fonction isDown.
A consulter absolument, pour la liste de toutes les valeurs pour désigner une touche :
https://love2d.org/wiki/KeyConstant
Appui simple
Parfois (souvent même) on ne veut réagir qu'une seule fois.
Love2D nous mâche me travail avec une fonction système (au même titre que love.load /
love.update et love.draw) :
function love.keypressed(key)
Cette fonction est appelée "une fois" quand une touche est enfoncée, et reçoit la constante
de la touche en paramètre. Pour réagir 2 fois à la même touche, il faut donc relâcher la
touche et la re-enfoncer.
Exemple pour afficher une trace de la touche enfoncée, et pour réagir une seule fois si le
joueur presse la touche ECHAP (dans ce cas là on quitte le jeu) :
function love.keypressed(key)
print("La touche "..key.." vient d'être enfoncée !")
A consulter absolument, pour la liste de toutes les valeurs pour désigner une touche :
https://love2d.org/wiki/KeyConstant
Gérer la souris
Projet de démo
📁 Voir le projet de démo (dans le dossier "Souris")
Coordonnées
Vous avez 3 façons de récupérer les coordonnées de la souris :
hero.x = love.mouse.getX()
hero.y = love.mouse.getY()
2) Par getPosition :
Clic continu
Pour détecter un clic continu, je vous conseille de faire comme pour le clavier. Vous
détectez l'appui sur un bouton dans love.update :
function love.update(dt)
if love.mouse.isDown(1) then
hero.x = love.mouse.getX()
hero.y = love.mouse.getY()
end
end
Note : le bouton de gauche vaut 1, le bouton de droite vaut 2 et le bouton du milieu vaut 3.
Clic simple
Pour détecter un clic unique, encore une fois c'est comme pour le clavier. On a une fonction
système pour ça :
A noter qu'il existe 3 autres fonctions systèmes pour la souris. Voyez si ça peut vous être
utile :
function love.mousemoved(x, y)
print("La souris s'est déplacée en "..tostring(x)..","..tostring(y))
end
function love.wheelmoved(x, y)
print("La roulette vient de tourner de (x,y) : "
..tostring(x)..","..tostring(y))
end
Dans le projet de démo vous pouvez tester qu'avec le clic gauche vous pouvez maintenir le
bouton enfoncé pour déplacer le personnage, alors que le personnage ne se déplace qu'une
fois à chaque clic avec le bouton droit.
Gérer le joystick
Introduction
Gérer un joystick c'est un peu complexe. Vu que le monstre est équipé de milliers de
boutons, dont des sticks analogiques qui peuvent d'incliner à différents degrés, etc.
Note :
● love.gamepadpressed
● love.gamepadreleased
● love.joystickpressed
● love.joystickreleased
● love.joystickadded
● love.joystickremoved
Je vous invite à en lire la doc si vous souhaitez les utiliser. Moi je me focalise dans mes
exemples sur du code exploitant directement le joystick connecté, en le lisant directement.
Détecter sa présence
C'est assez trivial. On demande la liste des joysticks… si il n'y en a pas au moins 1, alors
c'est qu'il n'y en a pas.
Facile !
Lire les valeurs des boutons
Déjà, avant de lire quoi que ce soit, il faut choper le joystick que vous voulez tester.
Disons, à tout hasard, que c'est le 1er joystick que vous voulez lire… (je blague, c'est
toujours le 1er qu'on teste hein…).
Ce qui est pratique pour alléger votre code (à mon goût) c'est de prendre référence du
joystick 1, 2… etc. dans une variable au nom court :
Il s'agit soit :
- De traiter un joystick comme un appareil branché dont on ne connait pas la position
des boutons, des sticks, etc. Du coup, techniquement à vous de 'mapper' les
boutons, etc.
- Soit de traiter le joystick comme un "Gamepad" standard, genre un Pad XBOX 360,
et donc Love nous 'mappe' les boutons X, Y, B, A, etc. comme il faut de manière
standard.
Mon code source travaille sur un Gamepad pour diriger le personnage, mais pour référence
je montre dans le code comment lire les boutons de manière indépendante du mapping,
juste avec leur numéro :
buttons = {}
if #joysticks > 0 then
local joy1 = joysticks[1]
for b=1,joy1:getButtonCount() do
buttons[b] = joy1:isDown(b)
end
end
C'est bien plus simple pour un Gamepad. Voici un exemple avec les principales données
dont vous pourrez avoir besoin :
Pour aller plus loin voir les autres valeurs pour les autres boutons du pad :
https://love2d.org/wiki/GamepadButton
Le truc le plus important à comprendre, c'est qu'un axe de stick analogique retourne une
valeur entre -1 et 1.
Clair ?
Mais comme l'axe n'est jamais totalement centré, je ne m'y intéresse que si il a une valeur
supérieure à 0.2 :
xAxis = joy1:getGamepadAxis("leftx")
yAxis = joy1:getGamepadAxis("lefty")