Étiquette : Dév Indé

  • Débuter avec le moteur de jeu Godot 4

    Débuter avec le moteur de jeu Godot 4

    J’ai pris Godot en main pour une petite game jam il y a deux ans et je ne suis jamais revenu à autre chose pour le 2D. J’avais utilisé Unity avant, et le contraste a été immédiat. Godot s’ouvre en moins de trois secondes, l’éditeur lui même est un seul téléchargement autonome d’une centaine de mégaoctets, et le tout est open source sous licence MIT. Cette dernière partie m’était indifférente jusqu’au jour où Unity a annoncé des frais sur le runtime et j’ai compris à quel point posséder ses outils compte. Cet article est l’orientation que j’aurais aimé qu’on me donne le premier jour.

    Ce qu’est réellement Godot

    Godot est un moteur gratuit et open source pour les jeux 2D et 3D. Il tourne sur Windows, macOS et Linux, et il exporte vers toutes les plateformes de bureau ainsi que le web, Android et iOS. Aucun compte à créer, aucun serveur de licence, aucun écran de démarrage sur votre jeu fini. Vous téléchargez l’éditeur, vous le décompressez, et vous le lancez. Je garde trois versions différentes sur disque parce que changer revient simplement à lancer un autre exécutable.

    La version qui a tout changé est Godot 4. Elle a apporté un moteur de rendu réécrit basé sur Vulkan, une vraie illumination globale pour la 3D, et une couche de script bien plus rapide. Si vous démarrez aujourd’hui, démarrez sur Godot 4. La plupart des tutoriels plus anciens visent Godot 3, et les différences d’API vous feront constamment trébucher.

    Nœuds et scènes, tout le modèle mental

    Tout dans Godot est un nœud. Un sprite est un nœud. Un lecteur audio est un nœud. Une forme de collision est un nœud. Vous organisez les nœuds en arborescence, et une arborescence sauvegardée s’appelle une scène. C’est vraiment toute l’architecture, et une fois que ça fait tilt vous arrêtez de vous battre contre le moteur.

    La partie qui m’a pris une semaine à intégrer, c’est que les scènes s’imbriquent. Une pièce de monnaie est une scène avec un sprite, une zone de collision et un son. Votre niveau est une scène qui contient des dizaines de scènes de pièces comme enfants. Votre jeu entier est une scène qui échange les niveaux. Il n’y a pas de concept séparé de prefab comme dans d’autres moteurs, parce que chaque scène est déjà réutilisable par conception.

    Voici comment je réfléchis au nœud à choisir :

    • Node2D est la base pour tout ce qui a une position, une rotation et une échelle dans l’espace 2D.
    • CharacterBody2D est ce qu’il vous faut pour un joueur ou un ennemi qui se déplace et entre en collision mais que vous contrôlez directement en code.
    • Area2D détecte les chevauchements sans rien pousser, parfait pour les objets à ramasser, les déclencheurs et les zones de dégâts.
    • Sprite2D et AnimatedSprite2D dessinent vos visuels.
    • CanvasLayer contient votre interface pour qu’elle reste fixe pendant que la caméra bouge.

    GDScript n’est pas Python, mais ça y ressemble

    Godot est livré avec son propre langage de script appelé GDScript. Il ressemble beaucoup à Python, avec des blocs basés sur l’indentation et un typage dynamique, mais il est intégré au moteur donc il connaît nativement les nœuds et l’arborescence de scène. Vous pouvez aussi utiliser C# si nécessaire, et il existe une voie C++ via GDExtension pour le code critique en performance, mais j’ai sorti de vrais jeux entièrement en GDScript sans jamais buter sur un mur.

    Chaque script étend un type de nœud. Les deux fonctions que vous écrirez sans cesse sont _ready, qui s’exécute une fois quand le nœud entre dans l’arbre, et _process, qui s’exécute à chaque image. Voici un petit script qui fait tourner un sprite et affiche un message :

    extends Sprite2D
    
    # Vitesse de rotation, en radians par seconde
    var spin_speed := 2.0
    
    func _ready() -> void:
        print("Le sprite est prêt")
    
    func _process(delta: float) -> void:
        # delta est le temps écoulé depuis la dernière image, donc le
        # mouvement reste constant quelle que soit la fréquence d'images
        rotation += spin_speed * delta
    

    Remarquez les indices de type optionnels avec les deux points et le deux points égal pour les types inférés. Je recommande fortement de typer vos variables. L’éditeur vous offre une meilleure autocomplétion, et le compilateur attrape des erreurs que vous trouveriez sinon à l’exécution.

    Le système de signaux, ou comment les nœuds se parlent

    Godot s’appuie beaucoup sur un motif de publication et abonnement appelé signaux. Un bouton émet un signal pressed. Une Area2D émet un signal body_entered quand quelque chose la chevauche. Vous connectez ces signaux à des fonctions, soit en glissant dans l’éditeur, soit en code. Cela garde vos nœuds découplés, parce qu’une pièce n’a pas besoin de connaître le joueur, elle annonce simplement qu’elle a été touchée.

    Vous pouvez connecter un signal en code comme ceci :

    extends Area2D
    
    func _ready() -> void:
        body_entered.connect(_on_body_entered)
    
    func _on_body_entered(body: Node2D) -> void:
        print("Quelque chose est entré : ", body.name)
        queue_free()
    

    L’appel à queue_free retire le nœud en toute sécurité à la fin de l’image. Familiarisez vous tôt avec les signaux. Lutter contre eux en interrogeant l’état à chaque image est l’erreur de débutant la plus courante que je vois.

    La disposition de l’éditeur où vous allez vivre

    L’éditeur a un dock Scène à gauche qui montre votre arborescence de nœuds, un dock FileSystem en dessous pour vos fichiers de projet, un Inspecteur à droite pour ajuster les propriétés, et la fenêtre de visualisation au milieu. Le panneau du bas abrite la console de sortie, le débogueur et l’éditeur d’animation. Je garde le débogueur ouvert en permanence parce que les traces de pile sont bonnes et que l’arbre de scène distant permet d’inspecter un jeu en cours d’exécution en direct.

    Une habitude qui a payé : organisez votre projet en dossiers dès le départ. J’utilise un dossier scenes, un dossier scripts, un dossier assets pour les visuels et l’audio, et un dossier autoload pour les singletons globaux. Godot n’impose aucune structure, donc la discipline vous revient.

    Les autoloads pour l’état global

    Quand vous avez besoin de quelque chose d’accessible partout, comme un gestionnaire de score ou un bus audio, vous enregistrez une scène ou un script comme autoload dans les paramètres du projet. Il devient un singleton qui se charge avant tout le reste et persiste à travers les changements de scène. C’est ainsi que je gère l’inventaire du joueur, les réglages et les données de sauvegarde. N’en abusez pas, mais pour les préoccupations vraiment globales c’est l’outil le plus propre que Godot offre.

    Exporter votre jeu

    Quand vous êtes prêt à partager, vous installez les modèles d’export une fois puis vous choisissez un préréglage pour chaque plateforme. L’export web est mon préféré pour les jams parce que vous téléversez un dossier et n’importe qui peut jouer dans un navigateur instantanément, sans téléchargement. Les exports de bureau produisent un seul exécutable. Tout le processus prend quelques minutes une fois configuré.

    Où aller ensuite

    Le moyen le plus rapide d’apprendre Godot est de construire quelque chose de minuscule et de le terminer. Ne commencez pas par votre RPG de rêve. Faites un jeu où une chose bouge et une chose se produit quand vous en touchez une autre. Une fois les bases du moteur acquises, l’étape naturelle suivante est de les assembler en quelque chose de jouable. J’ai écrit un guide complet exactement là dessus dans créer un jeu 2D dans Godot avec GDScript, où nous branchons un personnage qui se déplace, des collisions et un score à partir de zéro.

    Godot récompense ceux qui livrent. Le moteur s’écarte de votre chemin, la communauté est généreuse, et la documentation est vraiment excellente. Téléchargez le, ouvrez un projet vierge, et ajoutez votre premier nœud dès aujourd’hui.