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é.
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.
Type "Sprite2D" in the search bar to filter nodes and double-click on Sprite2D to create the node.
Your Scene tab should now only have a Sprite2D node.
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.
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.
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".
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.
The Script workspace should appear with your new sprite_2d.gd
file open and
the following line of code:
extends Sprite2D
using Godot;
public partial class MySprite2D : 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!")
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".
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!".
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
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.
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
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.
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.
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
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.
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.
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
using Godot;
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;
}
}