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é.
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.
Tapez "Sprite2D" dans la barre de recherche pour filtrer les nœuds et double-cliquez sur Sprite2D pour créer le nœud.
Votre onglet Scène devrait maintenant avoir seulement un nœud Sprite2D.
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.
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.
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".
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.
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
using Godot;
using System;
public partial class MySprite2D : 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!")
public MySprite2D()
{
GD.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!".
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
private int _speed = 400;
private float _angularSpeed = Mathf.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
public override void _Process(double delta)
{
Rotation += _angularSpeed * (float)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.
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
var velocity = Vector2.Up.Rotated(Rotation) * _speed;
Position += velocity * (float)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.
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
using Godot;
using System;
public partial class MySprite2D : Sprite2D
{
private int _speed = 400;
private float _angularSpeed = Mathf.Pi;
public override void _Process(double delta)
{
Rotation += _angularSpeed * (float)delta;
var velocity = Vector2.Up.Rotated(Rotation) * _speed;
Position += velocity * (float)delta;
}
}