Sweet Fighter

(by difsod)

Prototype réalisé dans le cadre de la GameCodeur GameJam #18 - "Street Fighter"


Élève (premium pro à vie) de GameCodeur : depuis 12 mois (difsod)

Langage et Framework utilisés : Lua / Pico-8 (mon septième projet concret sur cette console)

Code, graphismes et sons : moi-même

Utilisation de librairies et codes externes : non

Temps passé : 76h45, en 45 sessions de travail, divisées en phases différentes :

    - RÉFLEXION ET MISE EN PLACE (sur papier, essentiellement) : recherche d'idées, de concepts de jeu, de mise en scène, de mécaniques de jeu, recherche de solutions aux problèmes rencontrés, et publication sur Itch.IO... -> 4H20

    - CODAGE : mises en code et débogages -> 53H30

    - GRAPHISMES, SONS, MISE EN SCÈNE & POLISH : réalisation des sprites, des bruitages, placements dans l'écran de jeu, jaquette du jeu, et améliorations au fur et à mesure des avancées -> 18H55


Commandes

- Flèches du clavier --> déplacements    - - - - - -      Flèche du bas --> blocage d'attaque

- X --> coup simple    - - - - - -       C --> attaque spéciale

- X+C --> attaque spéciale n° 2 (non implémentée)

- Pour le deuxième joueur : E, S, D, F    - - - - - -       A, Z    - - - - - -       A+Z.


But du jeu

   Démolir le bonbec adverse, à l'aide de coups de boule (de gomme), de claques bien placées (dans les bonbons), de croche-pâtes (de fruits), et autres coups fourrés (à la fraise)...

Attention : l'usage de ce jeu est garanti sans danger pour les personnes diabétiques !


Comment j'ai abordé la contrainte du thème :

   Mon idée de départ était à la fois de rendre hommage à un jeu auquel j'ai adoré jouer lorsque j'étais ado, à savoir "Street Fighter II", mais aussi d'en faire une sorte de parodie (parce-que j'aime bien les parodies). J'ai donc commencé simplement par chercher des jeux de mots avec le titre, pour voir si ça pouvait me donner des idées, et le premier qui m'est venu était "Sweet Fighter". J'ai tout de suite bien aimé, car je trouvais qu'il sonnait bien, et son double-sens me plaisait bien également : "sweet" est un bonbon, mais signifie également "doux, tendre", et l'idée de créer un "jeu de baston tendre" me paraissait constituer un pied de nez assez amusant, et intéressant. La suite est donc venue tout naturellement. J'ai cherché quels bonbons je pourrais utiliser, et mes choix devaient répondre principalement à trois critères : il fallait qu'ils soient suffisamment connus (et reconnaissables facilement, malgré la faible taille des sprites et de la résolution de la Pico-8), il devaient être graphiquement intéressants et agréables à l’œil, et ils devaient me permettre d'imaginer des actions assez différentes, et originales, pour le côté combat. Puis, une fois ce choix fait, je me suis lancé, à la fois dans le code et dans le dessin des sprites. Et c'était parti !


Postmortem :

   Pour cette GameJam, j'ai voulu aborder des choses nouvelles, comme je le fais à chaque fois (afin d'apprendre de nouvelles techniques), mais aussi jouer avec des éléments familiers, afin d'approfondir celles que je connais déjà un peu. En l'occurrence, ce prototype a été l'occasion pour moi de me pencher sur la gestion de l'animation de sprites, que je n'avais pas encore abordée (avec découpage de spritesheet, gestion de différentes coordonnées (avec zones de collision diverses), vitesse et boucles d'animations, etc.), et sur la création d'un petit "générateur de nuage aléatoire", qui m'a bien amusé (et qui est un tout premier pas vers un domaine qui m'attire énormément, à savoir la "génération procédurale", au sens large du terme). J'ai pu aussi me faire plaisir avec un peu de pixel art, que je n'avais plus pratiqué depuis un bon moment.

    Les difficultés : Comme toujours, mon ennemi numéro reste la relative lenteur avec laquelle je fais les choses, mais cela s'améliore petit à petit, comme dans tous les domaines auxquels je m'intéresse de près, et dans lesquels je pratique régulièrement. Côté code, mes difficultés sont maintenant plus souvent inhérentes à la Pico-8 elle-même, et à ses contraintes, qu'à des choses réellement difficiles à coder. Ici, je me suis notamment heurté à la difficulté de gérer des sprites de tailles différentes, chose qui ne poserait pas de problème avec LÖVE, par exemple : dans cet environnement, rien n'empêche de normaliser tous les sprites à la même taille, quitte à avoir des parties transparentes plus ou moins grandes sur chacun, sur les côtés, et cela ne pose aucun problème. Dans la Pico-8, la place disponible étant très restreinte, il m'a fallu constamment jongler pour économiser de l'espace, et avoir recours à des listes assez "lourdes" contenant les coordonnées de chaque frame de chaque séquence d'animation, pour gérer leur affichage. Si j'avais gardé des sprites d'une taille multiple de 8, cela aurait été bien plus simple, mais j'aurais rapidement manqué de place, et il a donc fallu perdre beaucoup de temps à gérer cet élément particulier (et alors, l'espace gagné sur la spritesheet a donc été perdu dans l'espace dédié aux caractères, à cause de l'utilisation massive de listes répétitives). Dans le même ordre d'idée, j'ai souvent eu à recoder plusieurs fonctions pour tenter d'économiser des caractères au maximum, chose que je n'aurais pas eu besoin de faire (en tout cas certainement pas autant), encore une fois, dans un environnement comme LÖVE. Alors certes l'exercice de l'environnement contraignant est particulièrement bon pour apprendre à réfléchir, et à trouver des solutions pour contourner les limitations, et aussi se forger de bonnes habitudes d'optimisation, mais parfois ça devient un peu pesant, et c'est notamment pour cette raison que ce prototype sera mon dernier sous Pico-8 (du moins pour le moment). Pour le prochain, je me pencherai donc sur LÖVE, pour changer, et pour apprendre encore de nouvelles choses, et de nouvelles méthodes de travail.

    Les succès : J'arrive à coder plus rapidement et plus efficacement à chaque nouveau projet, et j'ai acquis certains automatismes qui me font gagner du temps, cette fois encore. Je maîtrise la Pico-8 de mieux en mieux, et j'arrive à trouver des solutions pour contourner certaines contraintes plus "naturellement" qu'auparavant. J'ai également réussi à créer un petit "générateur de nuage aléatoire", que j'avais en tête, et j'en suis bien content. Il n'est pas très compliqué, mais le réaliser a été un très bon exercice, très stimulant et très satisfaisant. Il m'ouvre en tout cas la porte de la "génération procédurale", qui me fascine, et que j'aimerais explorer en profondeur dans de futurs projets. Enfin, même si je n'ai pas eu le temps d'implémenter tout ce que je voulais, j'ai déjà une bonne base, relativement solide, sur laquelle je peux maintenant greffer de nouveaux éléments assez facilement. Bon, tout n'est pas encore parfait, et je vais devoir recoder entièrement certaines choses pour les adapter à la gestion de nouvelles fonctionnalités, mais c'est quand-même mieux codé et structuré que mes précédents prototypes, et je sens que j'ai encore un peu progressé, là aussi.

    Bilan : Le thème de cette GameJam m'a plu instantanément, parce que "Street Fighter" fait profondément partie de ma culture de joueur, et de ma jeunesse, et j'ai donc pris énormément de plaisir à tenter de coder un jeu de ce genre. J'ai notamment beaucoup aimé revisionner avec attention plusieurs séquences du jeu original, pour essayer de les décortiquer et de comprendre comment il était fait. Notamment en ce qui concerne l'ordre d'affichage des sprites, qui change constamment en fonction du joueur qui attaque, et qui est alors dessiné en second, pour apparaître par dessus l'autre. Je n'avais pas réfléchi à ce genre de détails, au départ, et c'était très intéressant de se pencher dessus et de s'y frotter, pour les reproduire. Je regrette un peu une nouvelle fois de ne pas avoir pu me pencher davantage sur la partie sonore du jeu, par contre, mais ça vient doucement aussi, petit à petit, à chaque nouveau prototype. Je devrais sans doute essayer de coder un jeu musical, prochainement, pour m'y frotter vraiment. Je crois l'avoir déjà dit, en fait, mais c'est vrai, je pense que ce serait un très bon exercice à faire, et qui me plairait également beaucoup.


A venir... :

- Il reste encore beaucoup de choses à faire pour que le jeu ressemble à l'idée que j'en avais au départ. Dans un premier temps, je vais déjà corriger certains bugs légers, et terminer la gestion des choses qui sont encore incomplètes (notamment la partie comptabilisation des rounds gagnés, l'affichage annonçant le personnage gagnant, et la fin de partie). Je dois également dessiner les animations des K.O. des personnages, et gérer le ralenti qui va avec. Ensuite, le reste du travail sera essentiellement graphique, avec les différentes animations des différentes attaques, et l'ajout de tous les autres personnages. Côté gameplay, il faudra aussi ajouter la gestion du choix du personnage, et la création d'une I.A. simple, pour pouvoir jouer contre la "machine". Et puis il y a aussi un gros travail à faire (mais qui sera totalement invisible pour le joueur), pour réduire encore la taille du code, pour implémenter toutes ces choses à venir. En effet, à l’heure où j'écris ces lignes, j'en suis rendu à 7424 tokens, sur les 8192 autorisés, donc il va falloir gagner de la place, dans peu de temps, sous peine de dépasser la limite (comme ça m'était déjà arrivé avec mon prototype de jeu d'aventure, "The Deadline", pour la GameJam #16).


En tout cas je continue à travailler sur ce petit jeu, donc s'il vous intéresse, je vous invite à revenir visiter cette page de temps en temps, pour pouvoir voir et profiter des nouveautés.

StatusPrototype
PlatformsHTML5
Authordifsod
GenreFighting
Made withPICO-8

Leave a comment

Log in with itch.io to leave a comment.