Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

Écoute des entrées du joueur

Building upon the previous lesson, Création de votre premier script, let's look at another important feature of any game: giving control to the player. To add this, we need to modify our sprite_2d.gd code.

../../_images/scripting_first_script_moving_with_input.gif

Vous disposez de deux outils principaux pour traiter les données du joueur dans Godot :

  1. Les rappels d'entrée intégrés, principalement _unhandled_input(). Comme _process(), c'est une fonction virtuelle intégrée que Godot appelle chaque fois que le joueur appuie sur une touche. C'est l'outil que vous voulez utiliser pour réagir aux événements qui ne se produisent pas à chaque image, comme appuyer sur Space pour sauter. Pour en savoir plus sur les rappels d'entrée, consultez Utilisation d'InputEvent.

  2. Le singleton Input. Un singleton est un objet accessible à tous. Godot donne accès à plusieurs d'entre eux dans les scripts. C'est le bon outil pour vérifier l'entrée à chaque image.

Nous allons utiliser le singleton Input ici car nous avons besoin de savoir si le joueur veut tourner ou bouger à chaque image.

Pour le tourner, nous devons utiliser une nouvelle variable : direction. Dans la fonction _process(), remplacez la ligne rotation += angular_speed * delta avec le code ci-dessous.

var direction = 0
if Input.is_action_pressed("ui_left"):
    direction = -1
if Input.is_action_pressed("ui_right"):
    direction = 1

rotation += angular_speed * direction * delta

Notre variable locale direction est un multiplicateur représentant la direction dans laquelle le joueur veut tourner. Une valeur de `` 0`` signifie que le joueur n'appuie pas sur la flèche gauche ou droite. Une valeur de 1 signifie que le joueur veut tourner à droite, et -1 signifie qu'il veut tourner à gauche.

Pour produire ces valeurs, nous introduisons les conditions et l'utilisation de Input. Une condition commence par le mot-clé "if" dans GDScript et se termine par deux points. La condition est l'expression entre le mot-clé et la fin de la ligne.

Pour vérifier si une touche a été enfoncée dans cette image, nous appelons Input.is_action_pressed(). Cette méthode prend une chaîne de texte représentant une action d'entrée et renvoie "vrai" si l'action est pressée, "faux" sinon.

Les deux actions que nous utilisons ci-dessus, "ui_left" et "ui_right", sont prédéfinies dans chaque projet Godot. Elles se déclenchent respectivement lorsque le joueur appuie sur les flèches gauche et droite du clavier ou sur les flèches gauche et droite du D-pad d'une manette.

Note

Vous pouvez voir et modifier les actions d'entrée dans votre projet en allant dans Projet -> Paramètres du projet et en cliquant sur l'onglet Contrôle.

Enfin, nous utilisons le direction comme multiplicateur lorsque nous mettons à jour le nœud rotation : rotation += angular_speed * direction * delta.

Si vous exécutez la scène avec ce code, l'icône devrait tourner lorsque vous appuyez sur Left et Right.

Se Déplacer en appuyant sur "up"

Pour ne se déplacer que lorsqu'on appuie sur une touche, nous devons modifier le code qui calcule la vélocité. Remplacez la ligne commençant par var velocity par le code ci-dessous.

var velocity = Vector2.ZERO
if Input.is_action_pressed("ui_up"):
    velocity = Vector2.UP.rotated(rotation) * speed

Nous initialisons le velocity avec une valeur de Vector2.ZERO, une autre constante du type intégré Vector représentant un vecteur 2D de longueur 0.

Si le joueur appuie sur l'action "ui_up", nous mettons à jour la valeur de la vélocité, ce qui fait avancer le sprite.

Script en entier

Here is the complete sprite_2d.gd file for reference.

extends Sprite2D

var speed = 400
var angular_speed = PI


func _process(delta):
    var direction = 0
    if Input.is_action_pressed("ui_left"):
        direction = -1
    if Input.is_action_pressed("ui_right"):
        direction = 1

    rotation += angular_speed * direction * delta

    var velocity = Vector2.ZERO
    if Input.is_action_pressed("ui_up"):
        velocity = Vector2.UP.rotated(rotation) * speed

    position += velocity * delta

Si vous exécutez la scène, vous devriez maintenant être capable de tourner avec les touches fléchées gauche et droite et d'avancer en appuyant sur Up.

../../_images/scripting_first_script_moving_with_input.gif

Résumé

In summary, every script in Godot represents a class and extends one of the engine's built-in classes. The node types your classes inherit from give you access to properties, such as rotation and position in our sprite's case. You also inherit many functions, which we didn't get to use in this example.

Dans GDScript, les variables que vous placez en haut du fichier sont les propriétés de votre classe, également appelées variables membres. Outre les variables, vous pouvez définir des fonctions qui, pour la plupart, seront les méthodes de vos classes.

Godot fournit plusieurs fonctions virtuelles que vous pouvez définir pour connecter votre classe avec le moteur. Il s'agit notamment de _process(), pour appliquer des modifications au nœud à chaque image, et _unhandled_input(), pour recevoir des événements d'entrée comme des pressions de touches et de boutons de la part des utilisateurs. Il y en a beaucoup d'autres.

Le singleton Input vous permet de réagir aux entrées des joueurs n'importe où dans votre code. En particulier, vous pourrez l'utiliser dans la boucle _process().

In the next lesson, Utiliser les signaux, we'll build upon the relationship between scripts and nodes by having our nodes trigger code in scripts.