Moteur de jeu Godot/Tutoriel/InputFacile
Coder très facilement un évènement suite a une action du joueur
[modifier | modifier le wikicode]Tuto créé par un débutant pour des débutants. Il peut y avoir des erreurs et imprécisions.
Ce tutoriel très simple pour débutant permet de réaliser ce qui est l'intérêt principal d'un jeu ou d'une application à savoir exécuter un script quand l'utilisateur appuie sur un bouton, bouge la souris ou fait n'importe quoi d'autre pour interagir avec le programme.
Puisque ce tuto marche avec à peu près tout, on va faire au plus simple et afficher du texte dans la console avec
print("Le texte à afficher")
apprennez à utiliser "if" "elif" et "else" si besoin car cela va vous aider énormément dans ce tutoriel.
Le projet
[modifier | modifier le wikicode]Dans cet exemple, on se contente de créer un nouveau projet vide et on crée directement une scène 2D que l'on va sauvegarder sans ajouter de nodes. On peut lui donner n'importe quel nom ou même laisser "node_2d.tscn" puisque ça n'a pas d'importance ici.
Définir des touches
[modifier | modifier le wikicode]Dans la barre de menus tout en haut de la fenêtre, on peut cliquer sur sur le menu "Projet" et sélectionner "Paramètres du projet".
La fenêtre s'ouvre et on peut observer tout en haut de celle-ci des onglets.
A coté de l'onglet "Général" actuellement actif, on a un onglet "Contrôles". Cliquez dessus.
Dans la nouvelle interface, on a de haut en bas :
- les filtres pour rechercher un nom ou un événement dans la future liste si elle est trop longue par exemple
- Un champ de texte "Ajouter une action", un bouton "ajouter" et un bouton bascule "Afficher les Actions Intégrés"
- Et enfin une liste d'actions et d'événements vides sauf si le bouton "Afficher les Actions Intégrés" a été activé
Cliquez sur le champ de texte "Ajouter une action" et tapez :
LeNomDeMonAction
Puis cliquez sur "Ajouter".
Dans la liste en dessous le nom que vous avez entré apparait suivi de 3 boutons :
- - "Zone morte" qui sert probablement pour les joysticks
- - "+" qui permet d'ajouter une touche ou une combinaison de touches
- - Une poubelle pour supprimer l'action ainsi que les touches associées
Cliquez sur "+" pour ajouter une nouvelle touche.
Une fenêtre s'ouvrira et attendra automatiquement que vous appuyez sur la touche désiré ou en sélectionnez une dans la liste.
Pour cet exemple, on va simplement appuyer sur la barre espace et cliquer sur "OK"
Vous aurez alors un sous item "Space (Physique)" dans la liste.
Cliquez sur le bouton "Fermer" en bas de la fenêtre et sauvegardez votre scène.
Le script
[modifier | modifier le wikicode]Faite un clic droit sur le node unique de votre scène qui se nomme probablement "Node2D" si vous avez laisser "node_2d.tscn" lors de l'enregistrement et sélectionnez "Attacher un script...".
Assurez-vous que "Langage" soit bien sur "GDscript" et cliquez sur "Créer".
Dans le code qui s'ouvre, vous avez probablement à la ligne 10:
func _process(delta):
Et une indentation à la ligne 11:
pass
Tout en gardant l'indentation, remplacez "pass" par les lignes suivantes :
if Input.is_action_pressed("LeNomDeMonAction"):
print("Vous avez appuyé sur la barre Espace")
Espace")
Voici un exemple minimal de code complet avec les commentaires
extends Node2D
# "extends" ajouté automatiquement et pouvant être différent de "Node2D" dans certains cas
# La fonction "_process"
func _process(delta):
# Si le ou les racourcis de l'action nommé "LeNomDeMonAction" sont appuyés:
if Input.is_action_pressed("LeNomDeMonAction"):
# Alors on execute le code ci-dessous
print("Vous avez appuyé sur la barre Espace")
# Ici on aura le texte "Vous avez appuyé sur la barre Espace" qui s'affichera dans la console tant qu'on appuie sur la barre d'Espace.
# Ça fera un maximum de lignes par seconde dans la plupart des configurations et ça s'arrête si on n'appuie plus sur le bouton.
Reste plus qu'à sauvegarder votre travail
Tester son code:
[modifier | modifier le wikicode]Cliquez sur "Lancer le projet" ou appuyez sur la touche F5 et dans la fenêtre qui s'ouvre cliquez sur "Sélectionner le dossier actuel".
Une fenêtre vide s'ouvre. Essayez de la garder active mais réduisez la taille ou déplacez-la de façon à voir la sortie en bas de l'éditeur.
En vous amusant à appuyer sur la barre Espace, vous constaterez probablement la sortie console suivante :
scene/main/window.cpp:1648 - Condition "!is_inside_tree()" is true.
Godot Engine v4.2.stable.official.46dc27791 - https://godotengine.org
OpenGL API 3.3.0 NVIDIA 551.23 - Compatibility - Using Device: NVIDIA - NVIDIA GeForce GTX 950
Parent node is busy setting up children, `add_child()` failed. Consider using `add_child.call_deferred(child)` instead.
scene/main/window.cpp:1648 - Condition "!is_inside_tree()" is true.
Vous avez appuyé sur la barre Espace
Vous avez appuyé sur la barre Espace
Vous avez appuyé sur la barre Espace
Vous avez appuyé sur la barre Espace
...
Fin du tutoriel?
On pourrais faire encore mieux
[modifier | modifier le wikicode]Comme vous l'avez vu Input..is_action_pressed() permet de lancer un script tant que l'action concernée est vraie ou "true" mais le code présent dans la fonction "_process()" se répète un maximum fois par seconde sur la plupart des configurations... Et on se retrouve avec notre texte qui se réécrit en boucle.
Ce n'est pas un problème dans certaines situations par exemple un script qui permet au joueur de déplacer un personnage dans un jeu de plateforme en maintenant la flèche de direction correspondante ou de glisser-déposer un item avec sa souris ou son écran tactile dans un puzzle mais dans ce cas-ci c'est moyen.
Ainsi tout en gardant le paramètre entre parenthèse, l'indentation et le "if", on pourrait remplacer
Input.is_action_pressed()
par
Input.is_action_just_pressed()
et en lançant notre programme on aurait une seule ligne d'écrite si on appuie une seule fois sur la barre Espace.
C'est utile par exemple pour jouer du lance-missile dans un Space Inviders.
Et tant qu'on y est, pourquoi ne pas rajouter dans notre script un magnifique "elif" suivi de
Input.is_action_just_released()
Le tout en mettant le nom de notre action "LeNomDeMonAction" dans les parenthèses comme précédemment avec un script qui s'exécuterait si on relâche le bouton. Imaginez un tir chargé dans un Gradius ou une attaque d'épée tourbillon dans un Zelda par exemple...
Maintenant vous pouvez vous débrouiller tout seul
[modifier | modifier le wikicode]Essayez de faire en sorte que le texte "Vous avez appuyé sur la barre Espace" ne s'affiche qu'une seule fois si ce n'est pas déjà fait et que le texte "Vous avez relâché la barre Espace" s'affiche une fois la touche relâchée
En lançant votre programme, en appuyant et relâchant 3 fois la barre Espace et en fermant la fenêtre vide de votre programme, vous devriez voir dans la sortie console quelque chose comme:
Parent node is busy setting up children, `add_child()` failed. Consider using `add_child.call_deferred(child)` instead.
scene/main/window.cpp:1648 - Condition "!is_inside_tree()" is true.
Godot Engine v4.2.stable.official.46dc27791 - https://godotengine.org
OpenGL API 3.3.0 NVIDIA 551.23 - Compatibility - Using Device: NVIDIA - NVIDIA GeForce GTX 950
Vous avez appuyé sur la barre Espace
Vous avez relâché la barre Espace
Vous avez appuyé sur la barre Espace
Vous avez relâché la barre Espace
Vous avez appuyé sur la barre Espace
Vous avez relâché la barre Espace
--- Debugging process stopped ---
Amusez-vous bien!
Le script final
[modifier | modifier le wikicode]Essayez par vous-même avant d'y jeter un œil
extends Node2D
# "extends" ajouté automatiquement et pouvant être différent de "Node2D" dans certains cas
# La fonction "_process"
func _process(delta):
# Si le ou les raccourcis de l'action nommée "LeNomDeMonAction" sont appuyés :
if Input.is_action_just_pressed ("LeNomDeMonAction"):
# Alors on exécute le code ci-dessous
print("Vous avez appuyé sur la barre Espace")
# Ici on aura le texte "Vous avez appuyé sur la barre Espace" qui s'affichera une seule fois dans la console.
# Et quand on relache la barre Espace...
elif Input.is_action_just_released("LeNomDeMonAction"):
# Alors on execute le code ci-dessous
print("Vous avez relâché la barre Espace")
# On en informe l'utilisateur dans la sortie console.
Évidemment le résultat n'est pas très utile mais avec l'apprentissage et la pratique on peu remplacer ce "print()" par des actions plus complexes !
Que faire après ?
[modifier | modifier le wikicode]Si vous débutez:
[modifier | modifier le wikicode]- Vous pouvez faire un script qui stocke dans une variable le nombre de fois ou on a appuyé sur un bouton et qui l'affichera dans la sortie console.
- Imbriquer les "if/elif/ekse" pour creer des sortes de racourcis claviers
Plus dur
[modifier | modifier le wikicode]- Afficher "3 fois 5 font 15" dans la sortie console en permettant a l'utilisateur de changer le premier ou le deuxième nombre de l'opération à l'aide de 4 boutons: 2 pour ajouter ou supprimer 1 a chacun des 2 nombres
- Faire se déplacer un personnage (ou un carré de couleur) sur la surface de jeu a l'aide de touches de directions soit de manière classique (façon Zelda) soit comme un tank (façon Micro Machine ou comme ça se faisait dans des jeux de la toute première PlayStation type Tomb Raider mais en 2D de préférence)
Pour les pros
[modifier | modifier le wikicode]- Créer un menu façon combat de Pokemon sur Gameboy ou Final Fantasy 7 sur la première Playstation avec haut et bas pour sélectionner, un bouton pour valider et un bouton pour annuler (il y aurait donc des sous-menus pour choisir quel objet ou attaque on souhaite utiliser)
Mémo (résumé)
[modifier | modifier le wikicode]Dans les Paramêtres du projet
[modifier | modifier le wikicode]Allez dans l'onglet "Contrôles" nommer votre action et cliquez sur "ajouter"
Cliquez sur "+" a droite de l'action que vous avez créé et appuyez sur la touche souhaité dans la fenêtre qui s'ouvre (ou sélectionnez-la dans la liste) puis cliquez sur "OK"
Une fois les actions et touches définies, fermez la fenêtre "Paramêtres du projet" et liez un script au node de la scène qui vous convient (une scène "joueur" par exemple)
Dans le script
[modifier | modifier le wikicode]Insérez une condition dans la fonction "_process()" ou une autre fonction plus adaptée à votre application ou jeu:
if/elif/else "MaCondition":
N'oubliez pas les 2 points ":" et l'indentation et remplacez "MaCondition" par un des choix suivants :
Si l'action peu tourner en boucle
[modifier | modifier le wikicode]Input.is_action_pressed()
Le joueur est-il en train d'appuyer sur la touche ?
Si l'action se joue une seule fois
[modifier | modifier le wikicode]Input.is_action_just_pressed()
Le joueur a-t-il appuyé sur la touche ?
Input.is_action_just_released()
Le joueur a-t-il relâché la touche ?
Le nom de l'action dans les parenthèses:
[modifier | modifier le wikicode]("MonAction")
N'hésitez pas à lire la documentation officielle pour plus d'infos.