Up to date

This page is up to date for Godot 4.2. 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

Please create a new project to start with a clean slate. Your project should contain one picture: the Godot icon, which we often use for prototyping in the community.

We need to create a Sprite2D node to display it in the game. In the Scene dock, click the Other Node button.

../../_images/scripting_first_script_click_other_node.webp

Type "Sprite2D" in the search bar to filter nodes and double-click on Sprite2D to create the node.

../../_images/scripting_first_script_add_sprite_node.webp

Your Scene tab should now only have a Sprite2D node.

../../_images/scripting_first_script_scene_tree.webp

A Sprite2D node needs a texture to display. In the Inspector on the right, you can see that the Texture property says "[empty]". To display the Godot icon, click and drag the file icon.svg from the FileSystem dock onto the Texture slot.

../../_images/scripting_first_script_setting_texture.webp

Note

You can create Sprite2D nodes automatically by dragging and dropping images on the viewport.

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

To create and attach a new script to our node, right-click on Sprite2D in the scene dock and select "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.

Change the Template field from "Node: Default" to "Object: Empty" to start with a clean file. Leave the other options set to their default values and click the Create button to create the script.

../../_images/scripting_first_script_attach_node_script.webp

The Script workspace should appear with your new sprite_2d.gd file open and the following line of code:

extends Sprite2D

Every GDScript file is implicitly a class. The extends keyword defines the class this script inherits or extends. In this case, it's Sprite2D, meaning our script will get access to all the properties and functions of the Sprite2D node, including classes it extends, like Node2D, CanvasItem, and Node.

Note

In GDScript, if you omit the line with the extends keyword, your class will implicitly extend RefCounted, which Godot uses to manage your application's memory.

Les propriétés héritées comprennent celles que vous pouvez voir dans le dock inspecteur, comme notre nœuds texture.

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.

You can hover over any property's name in the Inspector to see a description and its identifier in 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".

Save the scene as sprite_2d.tscn if you haven't already, then press F6 (Cmd + R on macOS) to run it. Look at the Output bottom panel that expands. It should display "Hello, world!".

../../_images/scripting_first_script_print_hello_world.webp

Delete the _init() function, so you're only left with the line extends Sprite2D.

Faire demi-tour

It's time to make our node move and rotate. To do so, we're going to add two member variables to our script: the movement speed in pixels per second and the angular speed in radians per second. Add the following after the extends Sprite2D line.

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.

To move our icon, we need to update its position and rotation every frame in the game loop. We can use the _process() virtual function of the Node class. If you define it in any class that extends the Node class, like Sprite2D, Godot will call the function every frame and pass it an argument named delta, the time elapsed since the last 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.

The line inside the function, rotation += angular_speed * delta, increments our sprite's rotation every frame. Here, rotation is a property inherited from the class Node2D, which Sprite2D extends. It controls the rotation of our node and works with radians.

Astuce

Dans l'éditeur de code, vous pouvez faire un ctrl-clic sur n'importe quelle propriété ou fonction intégrée comme "position", "rotation" ou "traitement" 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

In C#, notice how the delta argument taken by _Process() is a double. We therefore need to convert it to float when we apply it to the rotation.

Avancer

Let's now make the node move. Add the following two lines inside of the _process() function, ensuring the new lines are indented the same way as the rotation += angular_speed * delta line before them.

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.

We define a local variable named velocity, a 2D vector representing both a direction and a speed. To make the node move forward, we start from the Vector2 class's constant Vector2.UP, a vector pointing up, and rotate it by calling the Vector2 method rotated(). This expression, Vector2.UP.rotated(rotation), is a vector pointing forward relative to our icon. Multiplied by our speed property, it gives us a velocity we can use to move the node forward.

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.

Our node currently moves by itself. In the next part, Écoute des entrées du joueur, we'll use player input to control it.

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):
    rotation += angular_speed * delta

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

    position += velocity * delta