Création de votre premier script

Dans cette leçon, vous allez coder votre premier script pour faire tourner l'icône de Godot en rond en utilisant GDScript. Comme nous l'avons mentionné dans l'introduction, nous supposons que vous avez des bases de programmation.

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

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

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

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

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

Par défaut, l'inspecteur affiche les propriétés d'un nœud en "Title Case", avec les mots en majuscules 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 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 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."

Sauvegardez la scène si vous ne l'avez pas encore déjà fait, puis appuyez sur F6 pour l'exécuter. Regardez le panneau inférieur de sortie qui s'étend. Il devrait afficher "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.

extends Sprite

var speed = 400
var angular_speed = PI

Les variables membres se trouvent en haut du script, avant les fonctions. Chaque instance de noeud à laquelle ce script est attaché aura sa propre copie des propriétés speed et angular_speed.

Note

Comme dans certains autres moteurs, les angles dans Godot fonctionnent en radians par défaut, mais vous avez 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 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 Ton premier jeu 2d, vous apprendre 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 de l'entrée du lecteur, we'll use player input to control it.

Complete script

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