TestGame

Je suis actuellement en train de travailler sur un petit pour garder mes compétences à un bon niveau pendant ma recherche de travail / stage. Ce n’est rien de grandiose, surtout côté graphismes vu que c’est moi qui m’en occupe.

Mon idée de base était de faire un jeu ressemblant un peu à Ghouls and Ghost. Je compte aussi ajouter quelques fonctionnalités plutôt rogue-like mais je doit encore en décider.

J’essaie de travailler un bon nombre d’heures chaque semaine là dessus parmi les autres activités que j’ai, et ça marche plutôt bien pour le moment.

Il y a une chose à prendre en compte en lisant cette page, j’ai commencé à écrire à propos de ce projet un peu après l’avoir démarré donc les explications en début de page seront en majeure partie constituées de texte, sans captures d’écran. J’ai aussi écrit les trois premières étapes au même moment puisqu’elles sont antérieures à la date de création de cette page.

Étape 1 : Démarrer le projet

Au début de ce projet, je voulais fournir une sorte de démonstration de mon framework SFML mais aussi simplement pour le plaisir de faire un jeu en l'utilisant.

À ce moment là, j'avais déjà en tête de faire un jeu inspiré de Ghouls and Ghosts mais, comme vous le verrez avec les étapes suivantes, le style a un peu changé, même si la base reste la même.

J'ai commencé par faire les mouvements du personnage principal, dans le but d'avoir un départ qui m'aiderai à avancer par la suite, ce qui a bien marché.


J'ai aussi fait mes premières animations :



Évidemment, ce ne sont pas les meilleures mais au moins c'est les miennes ! Si le jeu grandit, peut-être que je les mettrais à jour pour les améliorer.

L'animation de marche a été un peu compliquée mais le fait que mon personnage est entièrement blanc m'aide beaucoup car je n'ai pas à gérer quel bras va où. Je me suis inspiré d'une animation que j'avais vu dans une vidéo quelques jours avant (merci TomSka) et l'ai recréée du mieux que j'ai pu.

La création de l'animation de saut m'a donné un peu de mal car, aussi surprenamment soit-il pour quelqu'un qui a étudié le développement de jeux vidéos, je n'ai jamais fait ça en dehors de moteurs où c'était déjà fait comme Unity ou Unreal Engine. Si vous regardez mes autres projets, personne ne saute car ça n'a jamais été demandé. Je n'ai pas voulu seulement faire monter le personnage en augmentant sa position en Y manuellement (ce qui aurait résulté en un saut triangulaire), j'ai donc utilisé un sinus car il a déjà la bonne forme et est assez facile à utiliser.

À part quelques changements d'état, le saut a été le seul vrai obstacle qui s'est dressé devant moi en matière de mouvements.

Étape 2 : Création du système d'armes

Même si "système d'arme" est un bien grand mot pour ce que c'est à l'heure actuelle, j'ai tout de même eu à faire marcher quelque chose. J'ai créé une classe principale (Abstraite) de laquelle vont hériter toutes celles que j'utiliserai plus tard pour pouvoir utiliser les mêmes fonctions entre chaque arme, une occasion d'utiliser le polymorphisme vu en cours à l'école.

Dague
Ma première arme est une dague, je n'ai pas encore décidé de ce qui la rendra unique mais puisque le personnage peu les lancer à peu près aussi vite qu'il le veux, je pense que ça restera comme ça. Ce sera une arme avec une cadence rapide et des faible dégâts,, du moins c'est comme ça que je le prévois pour le moment.

Créer cette arme a relevé un petit problème, mon animation de lancer prenais trop de temps, l'arme était lancée à la fin du mouvement et il y avait trop de latence entre l'appui sur la touche et l'action. J'ai donc raccourcis l'animation, qui est maintenant peut-être moins visible mais le gameplay s'en trouve amélioré.

Je vais certainement ajouter d'autres armes plus tard mais je voulais faire marcher le système et m'occuper d'autres choses avant.

Étape 3 : L'environnement

Jusqu'à ce moment, mon personnage bougeait dans le néant, j'ai donc décidé d'ajouter un peu de décor autour de lui et l'idée d'assembler des motifs prédéterminés entre eux pour créer le monde m'est venue. J'avais le même système que The Binding Of Isaac en tête, les formes des salles sont prédéterminées mais pas les étages, qui sont l'addition de plusieurs salles. Mon jeu est une addition de plusieurs sections avec des formes que j'ai créées mais l'ordre dans lequel elles arrivent n'est décidé par personne. Cela permet aussi au jeu de pouvoir continuer pour toujours et je n'ai pas à créer de niveaux, c'était la première idée "rogue-like" que j'avais en tête, d'autres arriveront plus tard.

Avant de choisir entre des centaines de modèles pour mes sections, j'en ai d'abord créé un premier pour essayer mon idée.

J'ai commencé par créer un fichier texte remplis de nombres : 
section0

0 étant les endroits vides et 1, le sol.

J'ai ensuite créé une classe qui lisait le fichier et remplissait un tableau de sprite aux endroits correspondants au sol. La première section était née ! J'ai fait un gestionnaire de niveaux contenant trois sections qui bougent l'une derrière l'autre pour créer un défilement, ça à marché assez bien assez vite, j'ai donc continué sur cette lancée et créé une classe Pattern qui contient un tableau de char rempli avec les 0 et les 1 ainsi que la hauteur de la première et de la dernière tuile pour faciliter les connexions ( la prochaine section ne peux pas être trop haut par rapport à la précédente ou le personnage ne pourra pas continuer ).

J'avais finalement mis mon idée en place : le Level Manager lit les fichiers de sections stockés dans un dossier et crée le même nombre de modèles dans une liste. Les sections sont instanciées depuis le manager en sélectionnant un pattern aléatoire (qui peut correspondre au niveau des hauteurs) dans la liste. Au lancement du jeu, trois sections sont créées et, au fur et à mesure de l'avancement du personnage, de nouvelles sont ajoutées à la suite des anciennes.

Une autre grosse partie du développement à été de faire bouger le décor en fonction des actions du joueur, quand stopper le personnage et quand le laisser bouger librement, pareil pour l'environnement. J'ai déterminé une zone où le personnage peux bouger, au delà de laquelle le décor se met à défiler.

J'ai trouvé un moyen de faire marcher tout ça en utilisant trois zones. Le personnage évolue dans la zone verte, quand il y bouge, le décor reste sur place. Quand il s'approche de la zone bleue et va vers la droite, le personnage va rester en animation de marche mais sera immobile pendant que le décor défilera vers la gauche. Quand le personnage touche la zone rouge et va vers la gauche, il n'avancera plus comme dans le cas précédent et le décor ira vers la droite mais comme les sections précédentes ont été détruites quand elles ont quitté la zone d'affichage, le défilement s'arrêtera au début de la section en cours. À ce moment là, le joueur peut aller complètement à gauche jusqu'au bord de la fenêtre et s'arrêter là.

L'étape finale en terme de gestion de l'environnement a été de marcher sur les différentes tuiles (le personnage volait au milieu de l'écran jusque là). J'ai simplement créé une fonction qui détermine où se trouve le sol sous le personnage et si ce dernier se trouve sur, au dessus ou au dessous de cette position. Si il est sous le niveau du sol, le personnage est élevé, aucune autre action n'est requise.

Étape 4 : Conclusion des trois étapes précédentes et ce qui vient ensuite

Voici la dernière section datant de la création de cette page, les étapes suivantes ne seront pas faites le même jour. Je vais maintenant parler de ce qui reste des étapes précédentes, ce qui doit encore être fait et ce qui va être créé dans le futur (plus ou moins proche).

Comme dit dans l'étape 3, le personnage se téléporte quand les tuiles ne sont pas au même niveau au lieu de tomber un peu, il réagit de la même manière quand la tuile suivante est pllus haute que l’actuelle.  Ces deux problèmes sont les prochaines tâches sur lesquelles je vais travailler et je pense que je vais même bloquer le personnage quand la prochaine tuile est plus haute pour forcer le joueur à sauter.

Une autre chose simple serait de détruire les projectiles qui touchent une tuile quand ils bougent, je ne veux pas de dagues qui creusent des galeries dans le sol !

Bien sûr, des ennemis arriverons plus tard ainsi qu'une meilleure gestion de la sélection de patterns pour la création des sections. Pour le moment les patterns ne sont absolument pas triés, ce qui veut dire que n'importe lequel peut être sélectionné, même s'il ne convient pas. Je vais sans doute les trier par hauteur pour aller plus vite et faire moins d'itérations et d'appels aléatoires. Je dois aussi vérifier les trois premières que je créée car je peux avoir des soucis de jonction sur ces dernières.

Je pense que c'est tout pour le moment, je vais donc laisser une vidéo de la version du jeu en cours juste dessous.


Étape 5 : Prise en charge de la manette et ennemis

La dernière mise à jour date un peu car j'ai du améliorer mon framework pour utiliser la manette dans les jeux que je crée. Ça m'a pris un peu de temps mais j'ai réussi à le faire marcher même s'il y a encore des améliorations à faire.

Mais parlons des nouveautés de ce projet, j'ai réglé bon nombre de bugs comme la téléportation du personnage et j'ai un peu amélioré son saut pour avoir une meilleure transition vers l'état de chute. J'ai aussi implémenté la destruction des projectiles qui touchent un ennemi ou le décor.

J'ai trié les patterns par hauteur dans un tableau de lites de patterns de la manière suivante :
il y a 12 emplacement pour chaque hauteur existante et les patterns sont ajoutés dans chaque emplacement compatible avec sa hauteur d'entrée. Par exemple, il y aura dans le huitième emplacement tous les patterns avec une hauteur en entrée de 7, 8 ou 9 tuiles. De cette manière, il n'est pas nécessaire de vérifier si le pattern sélectionné aléatoirement pourra se raccorder avec le précédent. Ceci me permet de faire moins d'instructions à chaque fois que je crée une nouvelle section, j'ai juste à faire une sélection aléatoire dans la bonne liste.
J'ai aussi réglé la petit problème que j'avais avec les trois première section créées au début du jeu qui n'étaient, parfois, pas compatibles les unes avec les autres.

Comme je l'ai mentionné au début, j'ai ajouté le support de la manette dans le jeu pour que le personnage puisse bouger quand on utilise le joystick gauche ou la croix directionnelle, et sauter ou utiliser l'arme avec les boutons en façade.

Ajout conséquent au jeu, j'ai créé des ennemis qui apparaissent à chaque nouvelle section, par groupes de trois. Pour l'instant, ils restent à l'emplacement où ils sont apparus et attendent de détecter le joueur près d'eux pour le poursuivre sans s'arrêter. Ils peuvent sauter et tomber pour toujours pouvoir continuer leur poursuite. Les armes peuvent faire perdre de la vie aux ennemis et les tuer, ils resterons alors immobiles. Les changements d'état des ennemis sont possibles grâce à une machine à états finis (FSM) qu'on avait utilisé à Créajeux pour Warcreaft.

Parmi les prochains objectifs :
Détruire les ennemis quand ils meurent, sans doute après une animation (ils sont déjà détruits quand ils sont sur une section qui est sortie de l'écran).
Faire attaquer les ennemis et blesser le joueur.
Faire marcher les ennemis quand ils ne poursuivent pas le joueur pour qu'ils ne restent pas plantés comme des piquets avant la détection.

Comme la dernière fois, je laisse une vidéo des progrès effectués où on peut voir le gameplay à la manette et les ennemis.