• Avoid - Slideshow

  • WC - Slideshow
  • Steering - Slideshow

  • WE SlideShow

  • PI - Slideshow

  • DOOM - Slideshow

  • TSOI - Slideshow

  • WS - Slideshow

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

This is the final part of the creation of the page, steps behind this one will not be done the same day. I will now say what remains of the previous steps, is still to be done and is going to be created in the (near or not) future.

Like said in step 3, the character teleports itself when the tiles are not on the same level instead of falling a bit, it also works when the next tile is higher than the previous one. Those two issues are the next things I will work on I think and I'm even going to block the character when the next tile is higher so the player will have to make a jump.

Another simple thing to do is destroying the weapons that touches a tile when moving, I don't want daggers digging in the ground !

Of course later will come enemies and a better handling of the pattern selection for the sections creation, currently the pattern are not sorted in any way which means that they are all a potential selection even if they will never fit, I intend to maybe sort them by entry height to go faster and do fewer iterations and random calls. I also have to verify the first three section created as I can have an issue with junction on these ones.

I think that's all for now so I leave a video of the current version of the game right there .


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

It's been a little while since the last update because I had to enhance my framework to use the controller in my games. It took me quite some time but I managed to make it work even if there are still some improvements to do.

But let's talk about the new features of the project, I resolved many bugs like the teleportation of the character and improved a bit its jump for a better transition to the falling state. I managed the destruction of the weapons when touching an enemy or the scenery.

I sorted the patterns by height in an array of pattern lists like that : 
There are 12 slots for each height and patterns will be added in each if their entry height is compatible with the index. For example in the 8th index, there will be patterns with an entry height of 7, 8 and 9. That way it isn't necessary to check if the randomly chosen pattern will fit the one before, this allow me to do fewer instructions each time I instanciate a new section, I juste have to do a random in the list for the layout.
Also in the topic of section creation, I resolved the little issue I had with the first three that could not fit sometimes.

Like I said at the beginning I added controller support to the game so the character can move with the left joystick or the Dpad and use the face buttons to jump and use weapons.

Big addition to the game, I created some enemies that are created with each new section, 3 at a time. For now they stay put where they appear and wait to detect the player in their area then proceed to pursue the player without ever stopping, they can even jump and fall to change their height in the level. The weapons can damage the enemies and kill them in which case they stand still. Enemies states transitions are possible thanks to a Finite-State Machine that we used in school on Warcreaft.

The next objectives would be to destroy the enemies when they die maybe after an animation (they are already destroyed if they're on a section that has passed the left border of the screen). Making them attack will be a good thing to do and hurting the character too. Also making the enemies walk when they do nothing would be nice so they don't stand still like billboards.

Like last time I leave you with a little progression video where we see the controller gameplay and the enemies.