Pour ce tout premier exercice, nous allons prendre en main Godot en construisant un petit personnage, puis en le faisant bouger à l’écran.
Rien de compliqué, c’est juste pour découvrir l’éditeur, les noeuds, les scènes et un premier script.
Il est basé sur les assets libres de droit Shape Characters de Kenney.
N’hésitez pas à me solliciter si vous êtes bloqués, si quelque chose n’est pas clair ou si vous avez besoin que je réexplique quelque chose. Ça pourrait être utile à tout le monde !
Pour commencer, lancez Godot et créez un projet. Son nom importe peu, notez juste l’endroit où il a été créé.
Une fois le projet créé et ouvert, prenez le temps de repérer les différentes zones de l’éditeur :
Si vous fermez ou déplacez un panneau par erreur, pas de panique :
Editor > Editor Layout > Default remet tout en
place.
Avant de commencer : téléchargez les assets, et extrayez-les dans le dossier du projet.
Dans Godot, tout est une scène composée de noeuds. Nous allons créer la scène de notre personnage.
Node2D.Character (clic droit > Rename,
ou F2).Sprite2D et renommez-le
Body.Body. Dans l’inspecteur,
glissez-déposez l’image du corps de votre choix (la
forme et la couleur que vous voulez) dans la propriété
Texture.Ctrl + S sous le nom
character.tscn.
Une scène sauvegardée est un modèle réutilisable (comme un prefab dans Unity) : on peut l’utiliser dans d’autres scènes. Nous y venons juste après.
Sprite2D en enfant du noeud
racine Character, et renommez-le
Face.Position).L’ordre des noeuds dans l’arbre est aussi l’ordre
d’affichage : un noeud placé plus bas
dans l’arbre est dessiné par-dessus ceux qui sont
au-dessus. Si le visage est caché derrière le corps, vérifiez qu’il est
bien après Body dans l’arbre.
Nous allons maintenant créer la scène qui contiendra notre jeu.
Scene > New Scene) avec un
Node2D comme racine, que vous nommerez
World.world.tscn.character.tscn depuis
le panneau FileSystem vers l’espace de travail : vous
venez de créer une instance de la scène.F5. Godot vous demande de choisir la
scène principale : sélectionnez
world.tscn.Vous devez voir votre personnage s’afficher dans la fenêtre. Si ce n’est pas le cas, vérifiez que les sprites ont bien une texture et qu’ils sont dans la zone visible de la fenêtre.
Qu’est-ce qu’une instance ?
La scène character.tscn est un modèle :
un plan qui décrit à quoi ressemble un personnage. Quand on la glisse
dans une autre scène, Godot crée une instance : un
exemplaire concret de ce modèle, avec ses propres noeuds et ses propres
valeurs.
On peut créer autant d’instances que l’on veut à partir d’un même modèle. C’est le même principe qu’un prefab et ses copies dans Unity.
Dans l’arbre de world.tscn, vous remarquerez que
l’instance apparaît comme un seul noeud Character, et non
comme Character avec ses enfants.
Les enfants sont bien là , ils sont juste cachés.
F5 lance la scène principale du projet,
alors que F6 lance la scène actuellement
ouverte.
Cela correspond aux boutons en haut à droite de l’éditeur.
Les noeuds sont organisés en arbre : un noeud peut avoir des enfants. Voyons ce que ça implique.
world.tscn, sélectionnez l’instance de
Character et déplacez-la (outil de
déplacement, ou propriété Position dans l’inspecteur).character.tscn, sélectionnez maintenant
uniquement Face et déplacez-le. Que se
passe-t-il cette fois ?Quand on déplace un parent, ses enfants suivent : leur position est exprimée relativement à celle de leur parent. C’est le principe des transformations hiérarchiques.
Pour l’instant, notre personnage ne bouge pas tout seul. Nous allons lui donner un comportement via un script.
character.tscn et sélectionnez le noeud
racine.+) et créez un script
character.gd._process et
modifiez-y la propriété position.La méthode _process est appelée automatiquement
à chaque frame par le moteur, et son paramètre
delta correspond au temps écoulé depuis la
frame précédente (en secondes).
C’est l’équivalent de Update dans Unity.
Voici une première version qui fait avancer le personnage vers la droite :
extends Node2D
func _process(delta: float):
position.x += 100.0 * deltaEn multipliant par delta, le personnage avance Ă la
même vitesse quel que soit le nombre d’images par
seconde de l’ordinateur. On décrit donc la vitesse en pixels par
seconde.
En GDScript, l’indentation (les tabulations en début de ligne) fait partie de la syntaxe : elle indique quelles lignes appartiennent à la fonction. Faites bien attention à la respecter !
Lancez le jeu : le personnage doit traverser l’écran.
Pour changer la vitesse, il faut pour le moment modifier le script.
Nous allons plutĂ´t l’exposer dans l’inspecteur, grâce Ă
une variable marquée @export.
speed précédée de
@export._process.La syntaxe pour déclarer une variable exportée :
@export var <nom_de_la_variable>: <type_de_la_variable> = <valeur_par_défaut>Dans notre cas, <type_de_la_variable> sera
float.
L’annotation @export est équivalente au
[SerializeField] de Unity.
Il est temps de prendre le contrôle du personnage : il doit avancer uniquement quand on appuie sur les flèches du clavier.
Godot propose des actions : des noms (comme
ui_left) auxquels sont associées une ou plusieurs touches.
Les actions ui_left et ui_right existent dĂ©jĂ
dans tous les projets et sont liées aux flèches du clavier.
_process, récupérez la direction avec
Input.get_axis("ui_left", "ui_right") et stockez-la dans
une variable direction.speed et delta.La fonction Input.get_axis renvoie un nombre entre
-1 et 1 :
-1 si on appuie sur la première action
(ui_left) ;1 si on appuie sur la seconde (ui_right)
;0 si on n’appuie sur rien (ou sur les deux).var direction = Input.get_axis("ui_left", "ui_right")Lancez le jeu et vérifiez que le personnage suit bien les flèches.
Nous créerons nos propres actions dans l’exercice suivant. Pour l’instant, on utilise celles fournies par Godot.
Grâce aux instances, on peut avoir autant de personnages que l’on veut à partir d’un seul modèle.
world.tscn.character.tscn (glisser-déposer depuis le panneau
FileSystem, ou Ctrl + D sur une instance
existante).Vous n’avez écrit le script qu’une seule fois, et
pourtant il s’applique à toutes les instances. Chacune a sa
propre valeur de speed. C’est tout
l’intérêt des scènes et des variables exportées.
Retournez dans la scène de character.tscn :
world.tscn.Que remarquez-vous ?
Quand vous modifiez un scène, toutes les instances sont mises à jour. En revanche, si vous modifiez une valeur dans l’inspecteur d’une instance (la vitesse par exemple), seule cette instance est modifiée.