Vous avez un projet Godot vide, vous savez naviguer dans l'editeur sans paniquer, et maintenant vous vous demandez : 'OK, mais comment Godot pense mon jeu ?' La reponse tient en trois mots : Nodes, Scenes, Scene Tree.
C'est simple sur le papier : des objets (nodes) organises en arborescence, sauvegardes dans des fichiers (scenes), puis reutilises par instanciation. Mais c'est aussi ce qui rend Godot tres robuste quand on construit un projet propre, modulable, et pas une scene unique monstrueuse.
Dans ce module, on va poser des bases solides, sans code, uniquement avec l'editeur. L'objectif n'est pas de faire un jeu jouable, mais de comprendre le coeur du moteur.
1) Contexte (ou on en est)
- Projet Godot 4.x vide (ou quasi vide)
- Vous savez retrouver les docks : Scene, Inspector, FileSystem
- Vous savez lancer le jeu (F5) et lancer la scene courante (F6)
- Vous avez deja l'intuition que tout est organise en hierarchie
Ce qu'il vous manque, c'est le modele mental : comment un jeu Godot est structure, comment on decoupe, et comment on evite de tout empiler dans Main.tscn.
On va donc creer deux scenes reutilisables :
Player.tscn(le joueur)HUD.tscn(l'interface)
Puis on va les instancier dans une scene Main.tscn.
2) Objectifs (ce que vous devez savoir faire a la fin)
A la fin de ce module, vous serez capable de :
- Expliquer ce qu'est un Node et citer des exemples concrets (player, enemy, UI).
- Expliquer ce qu'est une Scene (.tscn) et pourquoi ce n'est pas juste 'un niveau'.
- Lire le Scene Tree (parent/enfant) et comprendre pourquoi ca change tout (transformations, organisation, logique).
- Comprendre l'idee de scene reutilisable (comme un prefab) et l'interet pour un projet reel.
- Creer
Player.tscnetHUD.tscn(meme avec des placeholders). - Instancier ces scenes dans
Main.tscnvia l'editeur (sans code). - Comprendre les local changes et comment eviter de casser la scene d'origine.
- Savoir quand creer une nouvelle scene vs garder quelque chose dans la scene principale.
3) Vocabulaire minimal (sans jargon inutile)
- Node (Noeud) : une brique de base. Un node a des proprietes, peut avoir un script, peut emettre/recevoir des signaux, et surtout peut avoir des enfants.
- Scene (Scene) : un fichier
.tscnqui sauvegarde un arbre de nodes (une structure complete, reutilisable). - Scene Tree : la hierarchie parent -> enfants que vous voyez dans le dock Scene. C'est la structure reelle du jeu.
- Root node (Noeud racine) : le node tout en haut d'une scene. Tous les autres sont en dessous.
- Instance : une scene 'posee' dans une autre scene. Vous reutilisez un bloc deja construit.
- Local change : une modification faite sur une instance dans la scene qui l'utilise, sans modifier la scene source.
- Revert : revenir a la valeur d'origine (celle de la scene source) pour une propriete modifiee localement.
- Make Local : detacher une instance de sa scene source (vous obtenez une copie locale, independante).
Gardez une phrase en tete :
Un node est une brique. Une scene est un ensemble de briques organise. Le Scene Tree est la maniere dont ces briques sont rangees.
4) Comprendre les Nodes (avec des exemples qui parlent)
Un Node, c'est un objet du moteur, mais pas au sens 'objet 3D' ou 'sprite'. C'est plutot une entite logicielle qui fait quelque chose : afficher, detecter, gerer des entrees, jouer un son, organiser l'UI, animer.
Quelques exemples tres concrets (2D) :
- Node2D : un node avec une transformation 2D (position, rotation, echelle). Utile comme conteneur.
- CharacterBody2D : un node fait pour le deplacement avec collisions (parfait pour player et enemies).
- Sprite2D : affiche une texture.
- CollisionShape2D : donne une forme de collision a un objet (hitbox).
- Area2D : zone de detection (ramasser une piece, declencher un piege, zone de degats).
- Control (et ses enfants Label, Button, TextureRect...) : base pour l'UI.
- CanvasLayer : un calque d'UI independant de la camera (ideal pour un HUD).
Ce qui est important : dans Godot, un node est rarement seul. Un player n'est pas 'juste' un CharacterBody2D. Il a besoin d'un visuel, d'une collision, parfois d'une animation, de sons, etc. Donc on construit naturellement une hierarchie.
Exemple typique :
Player (CharacterBody2D)
├── PlayerSprite (Sprite2D)
└── PlayerCollision (CollisionShape2D)
Vous voyez deja la logique : le node racine porte la 'logique' (deplacement, interactions), et les enfants portent les 'composants' (visuel, collision). Ce n'est pas une regle absolue, mais c'est un standard sain.
5) Comprendre les Scenes (et pourquoi ce n'est pas qu'un niveau)
Une Scene, dans Godot, est un fichier .tscn qui contient un arbre de nodes. Beaucoup de debutants pensent 'scene = niveau'. En realite, une scene peut representer :
- un player (
Player.tscn) - un enemy (
Enemy.tscn) - une UI (
HUD.tscn) - un bouton complexe (
PauseMenu.tscn) - un morceau de decor (
Crate.tscn,Door.tscn) - un niveau complet (
Level01.tscn) - la scene principale (
Main.tscn) qui assemble le tout
L'idee cle : une scene peut etre un module. Comme un prefab dans d'autres moteurs. Vous la construisez une fois, proprement, puis vous la reutilisez partout.
Pourquoi c'est crucial ?
- Ca evite le copier-coller de nodes.
- Ca rend le projet lisible.
- Ca permet de modifier un module (ex : Player) et de retrouver le changement partout ou il est instancie.
- Ca limite la taille de
Main.tscn.
6) Scene Tree : parent/enfant, et pourquoi c'est important (pas juste pour ranger)
Le Scene Tree n'est pas qu'une liste pour faire joli. La relation parent/enfant a des consequences directes :
6.1 Transformations relatives (le truc qui sauve votre temps)
En 2D, la position d'un enfant est relative a celle du parent.
Donc si vous deplacez Player, son Sprite2D et sa CollisionShape2D suivent automatiquement. C'est exactement ce qu'on veut.
6.2 Organisation et lecture du projet
Une hierarchie bien faite vous permet de 'lire' un objet comme un schema :
- racine = role principal
- enfants = composants
Quand vous ouvrez la scene d'un enemy, vous devez comprendre en 10 secondes :
- ou est le sprite
- ou est la collision
- ou sont les zones de detection
6.3 Maintenance (le vrai sujet)
Quand votre jeu grossit, vous passez plus de temps a relire et modifier qu'a creer. Une hierarchie propre vous economise des heures.
Un detail tres pratique : nommer correctement vos nodes.
Evitez Sprite2D3 et CollisionShape2D7. Renommez tout de suite :
PlayerSpritePlayerCollisionScoreLabel
C'est un effort minuscule pour un gain enorme, surtout quand on ajoutera du code plus tard.
7) Quand creer une nouvelle scene vs garder dans Main ?
C'est une question que vous vous poserez tout le temps. Voici une regle simple, avec du bon sens :
Creez une nouvelle scene quand :
- L'objet est reutilisable (player, enemy, projectile, coffre, UI).
- L'objet est complexe (plusieurs nodes, une logique, des variantes).
- Vous voulez pouvoir tester l'objet en isolation (ouvrir
Player.tscnet voir juste le player). - Vous sentez que
Main.tscncommence a devenir un fourre-tout.
Gardez dans Main quand :
- C'est specifique au niveau ou a la scene (un decor unique, un node 'manager' temporaire).
- C'est un assemblage unique qui ne sera jamais reutilise.
- C'est du 'glue' : le fait de connecter des pieces ensemble.
Pensez a Main.tscn comme a une table de montage. On y assemble, on n'y fabrique pas toutes les pieces.
8) Demonstration dans l'editeur (sans code)
Objectif : creer deux scenes reutilisables, meme si elles sont encore vides ou tres simples, puis les instancier dans Main.tscn.
8.1 Creer Player.tscn (placeholder propre)
- Scene > New Scene (ou
Ctrl+N) - Choisissez comme noeud racine : CharacterBody2D
- Renommez-le :
Player - Ajoutez deux enfants a
Player:- Sprite2D -> renommez
PlayerSprite - CollisionShape2D -> renommez
PlayerCollision
- Sprite2D -> renommez
- Ne cherchez pas encore a faire bouger quoi que ce soit. On veut juste la structure.
- Sauvegardez : File > Save Scene As... ->
res://Player.tscn
Arbre attendu :
Player (CharacterBody2D)
├── PlayerSprite (Sprite2D)
└── PlayerCollision (CollisionShape2D)
Notes utiles :
- Le
Sprite2Dpeut rester sans texture. C'est OK, c'est un placeholder. - La
CollisionShape2Dvous demandera peut-etre une Shape dans l'Inspector plus tard. Pour ce module, la presence du node suffit.
8.2 Creer HUD.tscn (un HUD minimal)
- Scene > New Scene
- Racine : CanvasLayer (important pour que l'UI reste au-dessus du monde)
- Renommez la racine :
HUD - Ajoutez un enfant : Label
- Renommez-le :
ScoreLabel - Dans l'Inspector du Label, mettez
Texta :Score: 0 - Sauvegardez :
res://HUD.tscn
Arbre attendu :
HUD (CanvasLayer)
└── ScoreLabel (Label)
Pourquoi CanvasLayer ?
- Parce que le HUD ne doit pas bouger avec la camera. Le monde peut se deplacer, mais l'UI doit rester collee a l'ecran.
8.3 Creer Main.tscn et instancier Player + HUD
- Creez ou ouvrez
Main.tscn- Si elle n'existe pas : New Scene -> racine Node2D -> renommez
Main-> sauvegardezres://Main.tscn
- Si elle n'existe pas : New Scene -> racine Node2D -> renommez
- Dans
Main.tscn, selectionnezMain - Cliquez sur Instance Child Scene (bouton d'instanciation dans le dock Scene)
- Choisissez
Player.tscn - Recommencez : instanciez
HUD.tscn
Vous obtenez un arbre qui ressemble a :
Main (Node2D)
├── Player (CharacterBody2D) [instance]
└── HUD (CanvasLayer) [instance]
Optionnel (pour bien sentir le concept) :
- Dupliquez le Player dans Main (
Ctrl+D) pour en avoir 2 ou 3. - Vous verrez que ce sont plusieurs instances du meme module.
Test :
- Lancez avec F6 (scene courante) ou F5 (projet).
- Il n'y aura peut-etre pas grand-chose a l'ecran si le sprite est vide, mais l'important est : pas d'erreur, hierarchie propre, instances visibles dans l'arbre.
9) Local changes : modifier une instance sans casser l'original
C'est un point souvent mal compris, donc on va le rendre concret.
Imaginez :
Player.tscnest votre modele.- Dans
Main.tscn, vous avez une instance de Player.
Si, dans Main.tscn, vous selectionnez l'instance de Player et vous changez une propriete (par exemple sa position), Godot considere souvent ca comme une modification locale. C'est normal : chaque instance doit pouvoir etre placee differemment.
Mais vous pouvez aussi faire des changements plus profonds (selon les cas et les options d'edition d'instance). Godot vous indiquera qu'il y a une difference entre l'instance et la scene source. C'est ce qu'on appelle un local change.
Comment ne pas casser l'original ?
- Si vous voulez que le changement s'applique a tous les Players du jeu, modifiez
Player.tscndirectement. - Si vous voulez un changement uniquement pour cette instance dans
Main.tscn, faites un changement local.
Revert
Si vous avez modifie une propriete localement et que vous voulez revenir a la valeur d'origine, utilisez Revert (retour a la scene source). C'est une securite precieuse quand on a bidouille.
Make Local (attention)
Make Local detache l'instance : elle n'est plus liee a la scene source.
- Avantage : vous pouvez la modifier librement sans impacter l'original.
- Inconvenient : vous perdez les mises a jour automatiques venant de
Player.tscn.
Bon reflexe :
- Tant que possible, gardez le lien avec la scene source.
- Utilisez Make Local seulement quand vous assumez de creer une variante unique.
10) Pieges courants (et comment les eviter)
Piege 1 : la scene unique monstrueuse
Symptome : Main.tscn contient tout, des dizaines de nodes, des sous-groupes, des trucs temporaires, et personne ne comprend rien.
Solution :
- decouper en scenes reutilisables (player, enemy, UI, objets interactifs)
- garder
Main.tscncomme assembleur
Piege 2 : des noms incoherents
Symptome : Sprite2D, Sprite2D2, Node2D5.
Solution :
- renommer immediatement
- adopter une convention simple :
PlayerSprite,PlayerCollision,ScoreLabel - etre constant (meme style partout)
Piege 3 : ne pas savoir ou faire une modification
Symptome : vous changez un truc dans une instance, puis vous vous etonnez que les autres instances ne bougent pas. Ou l'inverse.
Solution :
- demandez-vous : 'est-ce un changement global (scene source) ou local (instance) ?'
- si global : ouvrez
Player.tscn - si local : modifiez dans
Main.tscnet acceptez le local change
11) Exercices
Exercice (obligatoire) : creer Player.tscn proprement
Objectif : construire la scene reutilisable, sans s'occuper du deplacement.
- Creez
Player.tscnavec :- racine
CharacterBody2DrenommeePlayer - enfant
Sprite2DrenommePlayerSprite - enfant
CollisionShape2DrenommePlayerCollision
- racine
- Sauvegardez la scene.
- Ne bougez rien, ne codez rien. On veut juste une base propre.
Critere de reussite :
- l'arbre est exactement celui attendu
- les noms sont propres
- le fichier
res://Player.tscnexiste
Challenge : creer HUD.tscn minimal
Objectif : une UI reutilisable.
- Creez
HUD.tscnavec :- racine
CanvasLayerrenommeeHUD - enfant
LabelrenommeScoreLabel - texte :
Score: 0
- racine
- Sauvegardez.
- Instanciez le HUD dans
Main.tscn.
Critere de reussite :
HUD.tscnexiste- le Label affiche
Score: 0en jeu (si vous lancez la scene)
12) Recap + checklist
Idee centrale : Godot = des nodes organises en arbre, sauvegardes en scenes reutilisables, instanciees pour construire le jeu.
Checklist :
- Je sais expliquer ce qu'est un Node et citer des exemples (CharacterBody2D, Sprite2D, Control).
- Je sais expliquer ce qu'est une Scene (.tscn) et pourquoi c'est reutilisable.
- Je comprends le Scene Tree (parent/enfant) et les transformations relatives.
- J'ai cree
Player.tscnavecPlayerSpriteetPlayerCollision. - J'ai cree
HUD.tscnavecScoreLabelqui afficheScore: 0. - J'ai instancie Player et HUD dans
Main.tscnvia l'editeur, sans code. - Je sais ce qu'est un local change et je sais quand modifier la scene source vs l'instance.
- Je sais reconnaitre le piege de la scene unique monstrueuse et je renomme mes nodes.
13) Mini quiz (pour verifier que c'est acquis)
- En une phrase : quelle est la difference entre un Node et une Scene ?
- Pourquoi une hierarchie parent/enfant est-elle utile pour un player avec sprite et collision ?
Player.tscnest instancie 5 fois dansMain.tscn. Vous voulez changer la taille du sprite pour tous les players. Vous modifiez ou ?- Vous avez deplace un Player dans
Main.tscnet Godot indique un changement local. Est-ce un probleme ? - Cite deux signes que votre projet est en train de tomber dans le piege de la 'scene unique monstrueuse'.