# Coder très facilement un évènement suite a une action du joueur

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é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
aprennez a utiliser "if" "elif" et "else" si besoin car cela va vous aider énormément danc ce tutoriel.

### Le projet

Dans 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

Dans 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:
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

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 "Creer".
Dans le code qui s'ouvre vous avez probablement a la ligne 10:
Et une indentation a la ligne 11:
Tout en gardant l'indentation remplacez "pass" par les lignes suivantes:
Voici un exemple minimal de code complet avec les commentaires
Reste plus qu'a sauvegarder votre travail

### Tester son code:

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. 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:
Fin du tutoriel?

### On pourrais faire encore mieux

Comme 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
par
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

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é
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:
Amusez-vous bien!

### Le script final

Essayez par vous-même avant d'y jeter un œil
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?
#### Si vous débutez:

* 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

* 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

* 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é)
#### Dans les Paramêtres du projet

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 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

Insérez une condition dans la fonction "_process" ou une autre fonction plus adapté a votre application ou jeu:
N'oubliez pas les 2 points ":" et l'indentation et remplacez "MaCondition" par un des choix suivant:

##### Si l'action peu tourner en boucle

Le joueur est t'il en train d'appuyer sur la touche?

##### Si l'action se joue une seule fois

Le joueur a t'il appuyé sur la touche?
Le juoeur a t'il relâché la touche?

##### Le nom de l'action dans les parenthèses:

N'hésitez pas a lire la documentation officiel pour plus d'infos.