Création de votre premier script

In this lesson, you will code your first script to make the Godot icon turn in circles using GDScript. As we mentioned in the introduction, we assume you have programming foundations. The equivalent C# code has been included in another tab for convenience.

../../_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

To learn more about C#, head to the C# basics page.

Configuration du projet

Veuillez créer un nouveau projet pour commencer avec une page blanche. 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 Sprite 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.png

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

../../_images/scripting_first_script_add_sprite_node.png

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

../../_images/scripting_first_script_scene_tree.png

Un nœud Sprite 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.png

Note

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

../../_images/scripting_first_script_dragging_sprite.png

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

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 Sprite dans le dock scène et sélectionnez "Attach Script".

../../_images/scripting_first_script_attach_script.png

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 modèle de Default à Empty pour commencer avec un fichier propre. Laissez les autres options par défaut et cliquez sur le bouton Créer pour créer le script.

../../_images/scripting_first_script_attach_node_script.png

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

extends Sprite

Chaque fichier GDScript est implicitement une classe. Le mot clé extends définit la classe dont ce script hérite ou qu'il étend. Dans ce cas, c'est Sprite, ce qui signifie que notre script aura accès à toutes les propriétés et fonctions du nœud Sprite, 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 Reference, que Godot utilise pour gérer la mémoire de votre application.

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

Note

By default, the Inspector displays a node's properties in "Title Case", with capitalized words separated by a space. In GDScript code, these properties are in "snake_case", which is lowercase with words separated by an underscore.

Vous pouvez survoler le nom d'une 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 is an indent-based language. The tab at the start of the line that says print() is necessary for the code to work. If you omit it or don't indent a line correctly, the editor will highlight it in red and display the following error message: "Indented block expected".

Save the scene 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.png

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

Faire demi-tour

Il est temps de faire bouger et pivoter notre nœud. Pour ce faire, nous allons ajouter deux variables membres à notre script : la vitesse de mouvement en pixels par seconde et la vitesse angulaire en radians par seconde.

var speed = 400
var angular_speed = PI

Member variables sit near the top of the script, after any "extends" lines, but before functions. Every node instance with this script attached to it will have its own copy of the speed and angular_speed properties.

Note

Angles in Godot work in radians by default, but you have built-in functions and properties available if you prefer to calculate angles in degrees instead.

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 Sprite, 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 Sprite étend. Elle contrôle la rotation de notre noeud et fonctionne avec des 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

Avancer

Faisons maintenant bouger le noeud. Ajoutez les deux lignes suivantes à la fonction _process(), en vous assurant que les nouvelles lignes sont indentées de la même manière que celle 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 appelée velocity, un vecteur 2D représentant à la fois une direction et une vitesse. Pour faire avancer le noeud, nous partons de la constante Vector2.UP de la classe Vector2, un vecteur pointant vers le haut, et nous le faisons tourner 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, il nous donne une vitesse que nous pouvons utiliser pour faire avancer le noeud.

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 prochaine partie Écoute des entrées du joueur, nous utiliserons les entrées du joueur pour le contrôler.

Script en entier

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

extends Sprite

var speed = 400
var angular_speed = PI


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

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

    position += velocity * delta