Création de votre premier script

In this lesson, you will code your first script to make the Godot icon turn in circles. As we mentioned in the introduction, we assume you have programming foundations.

This tutorial is written for GDScript, and the equivalent C# code is included in another tab of each codeblock for convenience.

../../_images/scripting_first_script_rotating_godot.gif

Voir aussi

To learn more about GDScript, its keywords, and its syntax, head to the GDScript section. To learn more about C#, head to the C#/.NET section.

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

../../_images/scripting_first_script_icon.svg

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

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

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

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

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

The Attach Node Script window appears. It allows you to select the script's language and file path, among other 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

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 trame et lui passera un argument nommé delta, le temps écoulé depuis la dernière trame.

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

In the code editor, you can Ctrl + Click (Cmd + Click on macOS) on any built-in property or function like position, rotation, or _process to open the corresponding documentation in a new tab.

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