Cours de programmation sur les moteurs de jeux

Introduction

Ce cours est la suite du cours d'introduction aux moteurs de jeux du semestre précédent. Maintenant que l'interface de Godot est maîtrisée, il est temps d'approfondir les possibilités de développement disponibles grâce à la rédaction de scripts. Pour l'instant, nous les rédigerons en GDScript.

Nous aurons en fil rouge de déveloper un jeu de stratégie en temps réel (STR ou RTS en anglais pour : real-time strategy). Pour commencer, vous pouvez télécharger la base de projet MyFirstRTS qui contient le minimum pour pouvoir commencer le développement mais pour vous dérouiller un peu, il n'est pas interdit de créer rapidement un environnement équivalent. Je tiens à préciser que les ressources graphiques que j'utilise ne sont pas de moi, elles proviennent de Kenney. J'ai notamment choisi le package Sci-Fi RTS pour les éléments graphiques et UI Pack: Space Expansion pour les éléments d'interface graphique.

Configurer les mouvements de caméra (Séance 1)

Voilà donc à quoi ressemble notre projet vu dans l'interface Godot lors du lancement : dommage Nous avons bien ajouté un noeud de type Camera2D à la scène mais pour l'instant aucun script n'y est attaché. Cependant, avant de se pencher sur le script, il y a quelques vérifications à effectuer dans l'inspecteur :

Il est maintenant temps d'ajouter un script à notre caméra, j'ai choisi de l'appeler Camera_movement.gd. Ce script est donc une classe qui hérite dans ce cas précis de Camera2D. Nous allons tout d'abord gérer les déplacement de la caméra via les appuis sur les touches directionnelles.

Exercice

À ce stade, si on lance notre scène, les déplacements de la caméra sont bien pris en compte, vous pouvez ajuster la vitesse de déplacement en modifiant la valeur de la variable speed dans l'inteface.

La prochaine étape est de paramétrer le zoom. Les actions de zoom vont s'effectuer grâce à la molette de la souris et seront gérées dans la fonction _input(event) qui ne se déclenche que sur les frames dans lesquelles le moteur a effectivement détecté un événement en entrée. La classe Camera2D a une proriété zoom de type Vector2 qui définit le zoom de la caméra par rapport à la fenêtre. Les valeurs supérieures au vecteur (1, 1) effectuent un zoom arrière et les valeurs plus petites effectuent un zoom avant.

Exercice

Si on teste maintenant, on constate un souci : une fois l'action de zoom (ou dé-zoom) lancée, la caméra zoom à l'infini tant qu'on n'actionne pas la molette dans le sens opposé. Nous allons résoudre ce problème !

Exercice

Rendre des objets sélectionnables

Le but de cette partie est de créer des objets selectionnables auxquels il sera possible par la suite d'appliquer des actions.

Exercice

Notre unité est prête à être scriptée ! Voilà à quoi ressemble notre scène :

dommage
La suite consiste à ajouter un script pour permettre de sélectionner l'unité par un click.

Exercice

Signaux (Séance 2)

Pour qu'une action sur un noeud puisse avoir des répercutions sur d'autre éléments du jeu, nous allons utiliser les signaux. Un signal est un message qui peut être émis par un objet afin qu'un autre puisse l'intercepter et y réagir. Je vous invite à lire leur principe de fonctionnement ici. Il est donc possible pour un noeud d'émettre un signal personnalisé, la syntaxe pour le déclarer est la suivante : signal mon_signal. Une fois déclaré, le signal apparaît dans l'inspecteur et peut être connecté de la même manière que les signaux intégrés d'un noeud. Le signal est émis par l'appel de la fonction emit_signal("mon_signal"). Il est possible de déclarer des arguments au signal : signal mon_signal (arg1, arg2, ...). On ajoute les valeurs de ces arguments à la suite du premier argument lors de l'émission : emit_signal ("mon_signal", val_arg1, val_arg2, ...). Il est également possible de connecter le signal dans le script : connect ("mon_signal", target, "method"). Cela permet donc au signal passé en premier paramètre d'être connecté à la méthode method de l'objet target.

Exercice

Exercice

Exercice Supplémentaire

Les mouvements de caméras, n'étaient pas parfaits et je pense que cela mériterait d'y apporter quelques améliorations :

Séance 3

Notre but maintenant va être de lier nos éléments de jeu à l'interface graphique. Dans un premier temps, nous allons faire apparaître, dans la barre d'interface du bas de l'écran, un bouton avec le bon label, lors de la sélection d'une unité. Un clic sur ce bouton entrainera la déselection de l'unité correspondante.

Exercice

Voilà pour la partie bouton. Sauvegardez votre scène. Voici à quoi elle pourrait ressembler :

dommage
Nous allons maintenant retourner dans notre scène World.tscn

Exercice

Voici ce à quoi devrait ressembler votre jeu à cet instant :

Exercice

Nous allons maintenant ajouter une barre de vie à nos unités et la faire apparaître en cas de sélection.