Il est possible de vérifier la présence d’une manette ainsi que son état et d’en être informé en jeu. Cette étape n’est pas
On commence par connecter le signal de la connexion de la manette nommé joy_connection_changed (détection d’un changement dans le branchement d’une manette (connexion, déconnexion)) à la fonction joy_con_changed dans le self (le Node actuel du Script) :
Input.connect("joy_connection_changed",self,"joy_con_changed")
On créer alors la fonction de réception joy_con_changed plus bas dans le Script :
func joy_con_changed(deviceid,isConnected):
if isConnected:
print("Joystick " + str(deviceid) + " connected")
if Input.is_joy_known(0):
print("Recognized and compatible joystick")
print(Input.get_joy_name(0) + " device connected")
else:
print("Joystick " + str(deviceid) + " disconnected")
Voila ! Les différents print permettent d’être informé sur plusieurs aspects de la manette (type (Ps4, Xbox, etc.), reconnaissance et compatibilité (prise en charge ou non par le moteur de jeu) et l’ID (utilisable pour assigner une manette à un personnage)). Avec toutes ces informations, il est déjà possible de mettre en place une attribution de manette à un Script précis :
enum NamedEnum {Player_01 = 0, Player_02 = 1, Player_03 = 2, Player_04 = 3}
export (NamedEnum) var nb_P
Il suffit à présent de saisir nb_P pour chaque paramètre Controler Devise des méthodes. Pour rappel, les exports variables permettent de modifier une variable d’un Script directement depuis l’éditeur, elles permettent également que plusieurs Nodes qui partagent un Script similaire soit dotée de paramètres différents. Pour le Node de votre premier joueur, indiquez Player_01, pour le second, Player_02.
Lorsqu’une manette est débranchée puis rebranchée, il est possible que son ID soit modifié !
On peut trouver la liste des méthodes d’appels des Input de la manette (et notamment ceux des boutons) dans l’aide Godot présent dans l’éditeur de Script. Il suffit d’y saisir le mot clef « joy » dans la barre de recherche pour limiter l’affichage aux éléments relatifs des JoyPad, on descend en suite jusqu’à la catégorie méthode. On peut cliquer sur la méthode de notre choix pour retrouver sa description et l’intégrer à notre projet. Prenons par exemple la méthode is_joy_button_pressed :
If Input.is_joy_button_pressed(Param1, Param2) :
Il faut ensuite renseigner les deux paramètres (Param1 et Param2)
for i in range(16):
if Input.is_joy_button_pressed(0,i):
print("Button at " + str(i) + " pressed, should be button: " + Input.get_joy_button_string(i))
On se retrouve donc avec plusieurs possibilités. On peut par exemple opter pour l’appel de mots clef :
if Input.is_joy_button_pressed(nb_P, JOY_BUTTON_0)
Ou bien saisir directement les valeurs :
if Input.is_joy_button_pressed(0, 0)
Une fois la vérification passée, on peut lancer les instructions de son choix.
Il est possible de récupérer la valeur d’un joystick analogique via la méthode :
Input.get_joy_axis(Param1, Param2)
Le premier paramètre correspond une nouvelle fois au Device et peut être renseigné de manière identique à la méthode employer pour les boutons. Le second paramètre correspond à l’axis (l’axe du joystick), il est possible de retrouver tous les axis dans la documentation. Godot scinde la valeur de chaque Joystick en deux, une pour sa position horizontale et une seconde pour sa position verticale. Chacune de ses valeurs varie entre 1 et -1 (0 étant le centre) à chaque extrémité de son axe. On peut donc utiliser la méthode suivante :
Input.get_joy_axis(0, JOY_AXIS_0)
Cela renvoi la position du Joystick gauche sur l’axe horizontale (JOY_AXIS_1 renvoi sa position sur l’axe verticale). Pour obtenir sa position globale, il est possible de regrouper ses deux valeurs en une variable :
var left_analog_axis = Vector2(Input.get_joy_axis(nb_P, JOY_AXIS_0), Input.get_joy_axis(nb_P, JOY_AXIS_1))
left_analog_axis peut donc être utilisé pour connaître la position du Joystick sur ses deux axes (x et y). On peut à présent déplacer le personnage selon la puissance de déplacement du joystick dans une direction, essayons avec l’axe horizontale :
position.x += 100 * delta * ( 3 * clamp(left_analog_axis.x,-1, 1))
Le personnage se déplace sur l’axe horizontale à une vitesse maximum de 3 multipliée par la puissance de pression, qui rappelons le, varie entre 1 et -1 (0 étant le centre, il ne bouge pas). La méthode clamp() permet de restreindre la valeur de l’analogue à un float entre -1 et 1 (car il est parfois possible que la valeur excède un tout petit peu 1 ou -1). Si on test cette configuration, on se rend rapidement compte d’un problème : Le centre au 0 parfait n’est presque jamais atteint et le personnage ne s’arrête jamais ! Cela est logique, puisque la variation entre les deux valeurs maximales atteint le millionième de décimale… Il va donc falloir restreindre la zone de lancement de notre fonction, on peut alors se servir de la variable créer plus haut :
Var deadZone = 0.2
if abs(left_analog_axis.length()) >= deadZone :
En créant la variable deadZone au préalable, il est possible de préciser la puissance de pression à dépasser pour lancer la fonction de déplacement. La méthode abs() appelée ici permet de renvoyer la valeur positive d’un nombre pour vérifier la limite des deux côtés de l’axe. En réalisant un nouveau test, on remarque que le personnage ne commence son déplacement qu’après une certaine pression atteinte, la condition fonctionne ! On peut alors répéter l’action avec l’autre axe :
Var deadZone = 0.2
var left_analog_axis = Vector2(Input.get_joy_axis(nb_P, JOY_AXIS_0), Input.get_joy_axis(nb_P, JOY_AXIS_1))
if abs(left_analog_axis.length()) >= deadZone :
position.x += 100 * delta * ( 3 * clamp(left_analog_axis.x,-1, 1))
position.y += 100 * delta * ( 3 * clamp(left_analog_axis.y,-1, 1))
Voila, notre personnage se déplace selon l’orientation des Joystick ! On peut réaliser le même genre d’action pour qu’un objet regarde dans la direction du joystick :
var joy_rot = atan2(right_analog_axis.y, right_analog_axis.x)
if right_analog_axis.length() >= deadZone:
rotation = joy_rot
Il est également possible de vérifier la puissance de pression des gâchettes arrière :
var trigger_left_axis = Input.get_joy_axis(0, JOY_AXIS_6)
if Input.is_joy_button_pressed(0, JOY_AXIS_6) :
if trigger_left_axis >= deadZone :
print(« hello »)
Gérer la vibration
Dans une manette, un moteur est disposé de chaque côté, à l’intérieur des manches. L’un permet une vibration rapide et relativement douce, le second est plus puissant et on remarque un décalage plus important entre chaque coup de vibration. Avec Godot il est possible de gérer la vibration des manettes avec la méthode suivante :
Input.start_joy_vibration(Param1, Param2, Param3, Param4)
Il est alors possible de faire varier la puissance d’un moteur de vibration selon la puissance de poussée d’un Joystick :
var trigger_left_axis = Input.get_joy_axis(0, JOY_AXIS_6)
Input.start_joy_vibration(0, clamp(trigger_left_axis,0,1), 0.0, 0.1)
L’utilisation du clamp est très importante, en effet, il est parfois possible que la valeur de la puissance du Trigger soit supérieure à 1, ce qui à pour effet de couper la vibration, on la limite donc à 1.
Pour la vibration des manettes autres que Xbox (qui sont naturellement adaptées au support PC), il est impératif de télécharger un logiciel tiers, pour les manettes P par exemple, il existe le soft Ds4Windows qui se charge de la gestion des périphériques Ps4. Cependant attention :
Il faut se renseigner pour tout autre périphérique.
Il y a une erreur de communication avec le serveur Booktype. Nous ne savons pas actuellement où est le problème.
Vous devriez rafraîchir la page.