Up to date

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

Création de votre premier script

Dans cette leçon, vous allez écrire votre premier script pour faire tourner l'icône de Godot en utilisant GDScript. Comme mentionné précédemment dans l'introduction, nous supposons que vous avez des bases de programmation. Le code équivalent en C# est inclut dans un autre onglet pour plus de simplicité.

../../_images/scripting_first_script_rotating_godot.gif

Voir aussi

Pour en savoir plus sur GDScript, ses mots-clés et sa syntaxe, consultez la Référence GDScript.

Voir aussi

Pour en savoir plus sur C#, lire la page bases C#.

Configuration du projet

Veuillez créer un nouveau projet pour partir de zéro. Votre projet doit contenir une image : l'icône Godot, que nous utilisons souvent pour le prototypage dans la communauté.

Nous devons créer un nœud Sprite2D pour l'afficher dans le jeu. Dans le dock Scène, cliquez sur le bouton Autre nœud.

../../_images/scripting_first_script_click_other_node.webp

Tapez "Sprite2D" dans la barre de recherche pour filtrer les nœuds et double-cliquez sur Sprite2D pour créer le nœud.

../../_images/scripting_first_script_add_sprite_node.webp

Votre onglet Scène devrait maintenant avoir seulement un nœud Sprite2D.

../../_images/scripting_first_script_scene_tree.webp

Un nœud Sprite2D a besoin d'une texture pour s'afficher. Dans l'inspecteur à droite, vous pouvez voir que la propriété Texture indique "[empty]". Pour afficher l'icône Godot, cliquez et faites glisser le fichier icon.png du dock FileSystem sur l'emplacement Texture.

../../_images/scripting_first_script_setting_texture.webp

Note

Vous pouvez créer des nœuds Sprite2D automatiquement en faisant glisser et en déposant des images dans la fenêtre d'affichage.

Ensuite, cliquez et faites glisser l'icône dans la fenêtre d'affichage pour la centrer dans la vue du jeu.

../../_images/scripting_first_script_centering_sprite.webp

Créer un nouveau script

Pour créer et attacher un nouveau script à notre nœud, cliquez avec le bouton droit de la souris sur Sprite2D dans le dock scène et sélectionnez "Attach Script".

../../_images/scripting_first_script_attach_script.webp

La fenêtre "Attacher un script au nœud" apparaît. Elle vous permet de sélectionner la langue du script et le chemin du fichier, en plus d'autres options.

Modifiez le champ Modèle de "Nœud : par défaut" à "Objet : vide" pour démarrer avec un fichier propre. Laissez les autres options définies sur leurs valeurs par défaut et cliquez sur le bouton Créer pour créer le script.

../../_images/scripting_first_script_attach_node_script.webp

Note

Les noms des scripts C# doivent correspondre à leur nom de classe. Dans ce cas, vous devez nommer le fichier MySprite2D.cs.

L'espace de travail Script devrait apparaître avec votre nouveau fichier sprite_2d.gd ouvert et avec la ligne de code suivante :

extends Sprite2D

Chaque fichier GDScript est implicitement une classe. Le mot-clé extends définit la classe dont ce script hérite ou étend. Dans ce cas, il s'agit de Sprite2D, ce qui signifie que notre script aura accès à toutes les propriétés et fonctions du nœud Sprite2D, y compris les classes qu'il étend, comme Node2D, CanvasItem et Node.

Note

Dans GDScript, si vous omettez la ligne contenant le mot-clé extends, votre classe étendra implicitement RefCounted, que Godot utilise pour gérer la mémoire de votre application.

Les propriétés héritées incluent celles que vous pouvez voir dans le dock Inspecteur, comme la texture de notre nœud.

Note

Par défaut, l'inspecteur affiche les propriétés d'un nœud en "Title Case", avec chaque mots commençant par une majuscule et séparés par un espace. En code GDScript, ces propriétés sont en "snake_case", en minuscules, et les mots séparés par un underscore.

Vous pouvez survoler le nom de n'importe quelle propriété dans l'inspecteur pour voir une description et son identifiant dans le code.

Hello, world !

Notre script ne fait actuellement rien. Faisons-le imprimer le texte "Hello, world !" dans le panneau inférieur de sortie pour commencer.

Ajoutez le code suivant à votre script :

func _init():
    print("Hello, world!")

Décomposons-la. Le mot-clé func définit une nouvelle fonction nommée _init. C'est un nom spécial pour le constructeur de notre classe. Le moteur appelle _init() sur chaque objet ou noeud lors de sa création en mémoire, si vous définissez cette fonction.

Note

GDScript est un langage basé sur l'indentation. La tabulation au début de la ligne qui dit print() est nécessaire pour que le code fonctionne. Si vous l'omettez ou si vous n'indentez pas correctement une ligne, l'éditeur la surligne en rouge et affiche le message d'erreur suivant : "Indentation inattendue".

Enregistrez la scène sous sprite_2d.tscn si vous ne l'avez pas déjà fait, puis appuyez sur F6 (Cmd + R sur macOS) pour l'exécuter. Regardez le panneau inférieur Sortie qui s'agrandit. Il devrait afficher "Hello, world!".

../../_images/scripting_first_script_print_hello_world.webp

Supprimez la fonction _init(), il ne vous reste que la ligne extends Sprite2D.

Changer la position

Il est temps de faire bouger et tourner notre nœud. Pour ce faire, nous allons ajouter deux variables membres à notre script : la vitesse de déplacement en pixels par seconde et la vitesse angulaire en radians par seconde. Ajoutez ce qui suit après la ligne extends Sprite2D.

var speed = 400
var angular_speed = PI

Les variables membres se trouvent en haut du script, après toutes les lignes "extends", mais avant les fonctions. Chaque instance de nœud à laquelle ce script est attaché aura sa propre copie des propriétés speed et angular_speed.

Note

Les angles dans Godot sont exprimés en radians par défaut, mais il existe des fonctions intégrées et des propriétés disponibles si vous préférez calculer les angles en degrés à la place.

Pour déplacer notre icône, nous devons mettre à jour sa position et sa rotation à chaque image de la boucle de jeu. Nous pouvons utiliser la fonction virtuelle _process() de la classe Node. Si vous la définissez dans une classe qui étend la classe Node, comme Sprite2D, Godot appellera la fonction à chaque frame et lui passera un argument nommé delta, le temps écoulé depuis la dernière frame.

Note

Les jeux fonctionnent en rendant de nombreuses images par seconde, chacune étant appelée "frame", et ils le font en boucle. On mesure la vitesse à laquelle un jeu produit des images en images par seconde (FPS). La plupart des jeux visent 60 FPS, mais vous pouvez trouver des chiffres comme 30 FPS sur des appareils mobiles plus lents ou 90 à 240 pour les jeux de réalité virtuelle.

Le moteur et les développeurs du jeu font de leur mieux pour mettre à jour le monde du jeu et rendre les images à un intervalle de temps constant, mais il y a toujours de petites variations dans les temps de rendu des images. C'est pourquoi le moteur nous fournit cette valeur de temps delta, rendant notre mouvement indépendant de notre framerate.

Au bas du script, définissez la fonction :

func _process(delta):
    rotation += angular_speed * delta

Le mot-clé func définit une nouvelle fonction. Après lui, nous devons écrire le nom de la fonction et les arguments qu'elle prend entre parenthèses. Un deux-points termine la définition, et les blocs indentés qui suivent sont le contenu ou les instructions de la fonction.

Note

Remarquez comment _process(), comme _init(), commence par un trait de soulignement. Par convention, les fonctions virtuelles de Godot, c'est-à-dire les fonctions intégrées que vous pouvez surcharger pour communiquer avec le moteur, commencent par un trait de soulignement.

La ligne à l'intérieur de la fonction, rotation += angular_speed * delta, incrémente la rotation de notre sprite à chaque image. Ici, rotation est une propriété héritée de la classe Node2D, que Sprite2D étend. Elle contrôle la rotation de notre nœud et fonctionne avec des radians.

Astuce

Dans l'éditeur de code, vous pouvez Ctrl-clic (Cmd-clic sur MacOS) sur n'importe quelle propriété ou fonction intégrée comme position, rotation ou _process pour ouvrir la documentation correspondante dans un nouvel onglet.

Exécutez la scène pour voir l'icône de Godot tourner en place.

../../_images/scripting_first_script_godot_turning_in_place.gif

Note

En C#, remarquez comment l'argument delta pris par _Process() est un double. Il faut donc le convertir en float lorsqu'on l'applique à la rotation.

Avancer

Faisons maintenant bouger le nœud. Ajoutez les deux lignes suivantes à l'intérieur de la fonction _process(), en vous assurant que les nouvelles lignes sont indentées de la même manière que la ligne rotation += angular_speed * delta qui les précède.

var velocity = Vector2.UP.rotated(rotation) * speed

position += velocity * delta

Comme nous l'avons déjà vu, le mot-clé var définit une nouvelle variable. Si vous le placez en haut du script, il définit une propriété de la classe. À l'intérieur d'une fonction, il définit une variable locale : elle n'existe que dans la portée de la fonction.

Nous définissons une variable locale nommée velocity, un vecteur 2D représentant à la fois une direction et une vitesse. Pour faire avancer le nœud, on part de la constante Vector2.UP de la classe Vector2, un vecteur pointant vers le haut, et on le fait pivoter en appelant la méthode Vector2 rotated(). Cette expression, Vector2.UP.rotated(rotation), est un vecteur pointant vers l'avant par rapport à notre icône. Multiplié par notre propriété speed, cela nous donne une vitesse que nous pouvons utiliser pour faire avancer le nœud.

Nous ajoutons velocity * delta à la position du noeud pour le déplacer. La position elle-même est de type Vector2, un type intégré dans Godot représentant un vecteur 2D.

Exécutez la scène pour voir la tête de Godot tourner en rond.

../../_images/scripting_first_script_rotating_godot.gif

Note

Déplacer un nœud comme cela ne prend pas en compte les collisions avec les murs ou le sol. Dans Votre premier jeu 2d, vous apprendrez une autre approche pour déplacer des objets tout en détectant les collisions.

Notre nœud se déplace actuellement tout seul. Dans la partie suivante, Écoute des entrées du joueur, nous utiliserons l'entrée du joueur pour le contrôler.

Script en entier

Voici le fichier complet sprite_2d.gd pour référence.

extends Sprite2D

var speed = 400
var angular_speed = PI


func _process(delta):
    rotation += angular_speed * delta

    var velocity = Vector2.UP.rotated(rotation) * speed

    position += velocity * delta