Les prémices d'un survival zombie (online ?) - FTH#1 Devlog#1
Vermeille Il y a 2 ans Premium Pro - Adhésion à vie0

Bien le bonjour. Je ne sais pas si grand monde va me lire, mais ça me permet aussi de suivre ma progression, donc ce n’est pas plus mal.

I. Contexte

J’ai commencé la formation il y a un mois environ, un peu à reculons au début je dois l’avouer car je ne suis pas un complet débutant, j’ai déjà codé plusieurs projets, notamment sur Unity, alors c’était un peu redondant de se refaire expliquer ce qu’est une variable, une condition, etc. Mais j’ai préféré ne pas sauter de cours car même dans les basiques, au détour d’une parenthèse, on peut apprendre de nouvelles choses. Et j’ai été surpris par Love2D, je ne connaissais pas avant, et sa simplicité m’a séduit.

Avant je n’ai fait que des projets sur Unity, et un touuuuut petit peu sur Pico8 à l’école mais rien d’exceptionnel. Et comme le dit David, on ne va pas acheter du pain avec un tank, et Unity finalement est si gros que ça peut en être intimidant parfois. Là avec Love2D j’ai pu revenir aux bases, et travailler sur un matrice, et j’ai trouvé ça super cool et agréable. Et c’est lors du projet de tilemap, et plus précisément de déplacements sur tilemap qu’un projet a commencé à germer dans mon esprit.

Sur la fin, lorsque l’on crée un brouillard de guerre en fonction de la distance au personnage, je me suis dit « tiens, ce serait sympa si les obstacles comme des arbres ou des rochers cachaient la vision derrière eux » et je me suis attelé à la tache.

II. Brouillard de guerre

(Avant tout ça j’avais déjà fait une petite modification au brouillard, tout ce qui est inconnu reste noir, par contre les parties déjà explorées restent, certes très sombres, mais toujours visibles pour avoir une vision de la typographie du terrain, et avoir une trace de ce qu’on a déjà exploré et ce qu’il nous reste à découvrir.)

Cela m’a pris une journée entière à coder, je ne savais pas trop par quoi commencer, donc j’ai d’abord découper la tâche en sous-parties, certaines étant des prérequis d’autres parties. Tout d’abord, il faut connaître les différents obstacles qu’il y a autour. J’ai donc commencé par créer douze listes, deux horizontales, deux verticales, quatre obliques, et quatre pour les « quartiers » Nord-Est, Sud-Est, etc. L’idée était de regrouper les obstacles par rapport à la façon dont ils allaient interagir avec le personnage par rapport à leur position.

Avoir des listes c’est bien, mais maintenant il faut les remplir. Et là j’ai été bloqué une petite demi-heure je pense. J’avais créé les bonnes conditions, par exemple. Si le x de l’obstacles est nul et le y est négatif, alors l’obstacle est juste au dessus du héros, et donc il faut le ranger dans la liste « Top ». Mais ça ne marchait pas, jusqu’à ce qu’en utilisant un print, je me suis rendu compte que lorsque mon personnage bougeait, les coordonnées des obstacles restaient les mêmes. Et là ça a fait tilt, il ne faut pas que j’utilise les coordonnées absolues des obstacles, mais leurs coordonnées relatives par rapport au héros. Pour cela j’ai fait un calcul de vecteur très simple. À partir de là le problème fut résolu, les listes se remplissaient comme il faut. Ne pas oublier de les vider à chaque fois avant de les re-remplir d’ailleurs !

Je ne sais pas si c’était nécessaire, mais j’ai fait une fonction qui classes les obstacles d’une liste par ordre croissant en fonction de leur distance au personnage. Ce n’est même pas visuel car rien ne me montrent les listes, mais je sais que c’est bien rangé. Il ne reste plus qu’à vérifier pour chaque cases à portée de vision s’il y a un obstacles entre le héros et cette case.

Pour cela, j’utilise deux méthodes différentes. Peut-être qu’une seule aurait suffit, mon code est très largement optimisable, mais sur le moment c’est venu comme ça.

La première, c’est pour les cas où la case est soit parfaitement verticale, horizontale, ou en diagonale pure par rapport au héros. Dans ce cas, je vérifie que sa distance est plus grande qu’au moins un des obstacles dans la liste correspondante, et si c’est le cas, alors c’est dans l’ombre. Aucun problème pour cela, j’ai fait une petite fonction qui compare la distance entre deux objets par rapport à un même objet et qui renvoie true si le premier est plus loin que le second.

Pour les autres cas, où la case est par exemple en [3,2] par rapport au personnage, j’ai fait une comparaison d’angles. Je compare l’angle qu’il y a entre le personnage et la case, tout en vérifiant s’il est entre les deux angles du héros jusqu’à chacun des des coins « larges » de chacun des obstacles. Si c’est le cas pour au moins l’un des obstacles, alors c’est dans l’ombre.

Et voilà, j’ai maintenant un système de brouillard de guerre qui prend en compte les obstacles, et que je vais pouvoir personnaliser pour par exemple dire que des ennemis peuvent cacher d’autres ennemis derrière ! Cependant l’effet n’était pas très réussi, car la vision claire était trop restreinte. J’ai donc utilisé une fonction logarithme pour avoir une vision beaucoup plus élargie mais qui devient très vite sombre aussi, on a donc un système de vision non linéaire qui donne un côté sympa je trouve, plus vivant.

III. La suite

Un nom pour le projet serait cool, pour l’instant c’est Fear The Horde, mais je ne sais pas trop ce que ça va devenir encore, donc c’est peut-être plus important de penser aux mécaniques. J’ai mon petit code c’est cool mais ce n’est pas encore un jeu. Déjà il faut que j’optimise la bestiole parce que quand il y a trop d’obstacles (à partir de quatre, autant dire que c’est peu), il freeze entre chaque déplacement, ce qui est assez désagréable. Mais ensuite, j’ai vu plusieurs projets qui m’intéressent et qui pourraient s’ajouter parfaitement à mon petit projet : Atelier : Donner vie à une horde de zombis (Les bases de l’Intelligence Artificielle) qui va me permettre de rajouter des hordes de zombies, qui peuvent se cacher derrière des arbres et se cacher entre eux aussi, donnant l’impression qu’il n’y a que deux trois zombies alors qu’il y en a une dizaine derrière, je pense que ça peut être sympa, à voir ! Un autre est le projet de rpg en ligne qui est en cours en ce moment, l’atelier 57 il me semble, pour pouvoir vivre ça entre amis, ce genre de jeux s’y prête bien. Mais aussi rajouter de l’aléatoire comme dans  Atelier : Maîtriser la génération procédurale (façon Binding of Isaac). 

Ensuite, j’aimerais peaufiner le système de vision pour que ce soit plus en cône, pour avoir un côté un peu plus réaliste et rajouter du stress. Pour le côté multijoueur, j’aimerais baser sur de la coopération, avec notamment un gameplay où chaque joueur ne peut porter qu’une chose à la fois, donc un joueur qui porte une arme, un autre un kit de soin, etc. C’est peut-être ambitieux mais vu que c’est le thème du moment j’aimerais créer un système de metroidvania, mais procédural ! Ce serait donc plutôt un jeu de survie mais couplé à de l’aventure et du jeu de réflexion. Le projet va très certainement évoluer, ce sera marrant de voir les idées que j’avais en tête maintenant par rapport à ce qui sera implémenté dans six mois !

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.