Moteur de jeu Godot/Tutoriel/InputFacile
Coder très facilement un évènement suite a une action du joueur
modifierTuto 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éres principal d'un jeu ou d'une application a savoir executer un script quand l'utilisateur appuis sur un bouton, bouge la souris ou fait n'importe quoi d'autre pour intéragir avec le programme.
Puisque ce tuto marche avec a peu près tout on va faire au plus simple et afficher du texte dans la console avec
print("Le texte à afficher")
aprennez a utiliser "if" "elif" et "else" si besoin car cela va vous aider énormément danc ce tutoriel.
Le projet
modifierDans cet exemple on se contente de créer un nouveau projet vide et on crée directement une scene 2D que l'on va sauvegarder sans ajouter de nodes. On peu lui donner n'importe quel nom ou même laisser "node_2d.tscn" puisque ca n'a pas d'importence ici.
Définir des touches
modifierDans la barre de menus tout en haut de la fenêtre on peu cliquer sur sur le menu "Projet" et selectionner "Paramêtres du projet".
La fenêtre s'ouvre et on peu observer tout en haut de celle-ci des onglets.
a coté de l'onglet "Général" actuellement active 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 évennement 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'évennements 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é apparêt suivit 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és
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éléctionnez une dans la liste.
Pour cet exemple on va simplement appuyer sur la barre espace et cliquez 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
modifierFaite 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 "Creer".
Dans le code qui s'ouvre vous avez probablement a la ligne 10:
func _process(delta):
Et une indentation a 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 tent qu'on appuis sur la barre d'Espace.
# Ca fera un maximum de lignes par secondes dans la plupars des configurations et ca s'arrête si on n'appuis plus sur le bouton.
Reste plus qu'a sauvegarder votre travail
Tester son code:
modifierCliquez 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. Essauez de la garder active mais réduisez la taille ou déplacez-la de façon a voir la sortie en bas de l'éditeur.
En vous amusant a 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
modifierComme vous l'avez vu Input..is_action_pressed() permet de lancer un script tant que l'action concerné est vrais ou "true" mais le code présent dans la fonction "_process()" se répète un maximum fois par secondes 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 correspondente 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 pourrais remplacer
Input.is_action_pressed()
par
Input.is_action_just_pressed()
et en lançant notre programme on aurais une seule ligne d'écrite si on appuis 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" suivit 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écuterais 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
modifierEssayez 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é
En lancant votre programme, en appuyant et relachant 3 fois la barre Espace et en fermant la fenêtre vide de votez programme vous devriez voir dans la sortie console quelquechose 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
modifierEssayez 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 racourcis de l'action nommé "LeNomDeMonAction" sont appuyés:
if Input.is_action_just_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 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.
Evidemment 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?
modifierSi vous débutez:
modifier- 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- Afficher "3 fois 5 font 15" dans la sortie console en permettant a lutilisateur de changer le premier ou le deuxième nombre de l'opération a l'aide de 4 boutons: 2 pour ajouter ou supprimer 1 a chacuns 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 (facon Micro Machine ou comme ca 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- 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 selectionner, un bouton pour valider et un bouton pour annuler (il y aurais donc des sous-menus pour choisir quel objet ou attaque on souhaite utiliser)
Mémo (résumé)
modifierDans les Paramêtres du projet
modifierAllez 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 selectionnez-la dans la liste) puis cliquez sur "OK"
Une fois les actions et touches définis fermez la fenêtre "Paramêtres du projet" et liez un script au node de la scene qui vous convient (une scène "joueur" par exemple)
Dans le script
modifierInsérez une condition dans la fonction "_process()" ou une autre fonction plus adapté a votre application ou jeu:
if/elif/else "MaCondition":
N'oubliez pas les 2 points ":" et l'indentation et remplacez "MaCondition" par un des choix suivant:
Si l'action peu tourner en boucle
modifierInput.is_action_pressed()
Le joueur est t'il en train d'appuyer sur la touche?
Si l'action se joue une seule fois
modifierInput.is_action_just_pressed()
Le joueur a t'il appuyé sur la touche?
Input.is_action_just_released()
Le juoeur a t'il relâché la touche?
Le nom de l'action dans les parenthèses:
modifier("MonAction")
N'hésitez pas a lire la documentation officiel pour plus d'infos.