Maman, j’ai raté la Game Jam ! (Code Alone)
Little Ryu Il y a 2 semaines Premium Pro6

Bonjour à tous.

 

Ça fait un bail que je n’avais pas pris le temps de publier quelque chose sur GameCodeur (presque deux ans… ouch !). J’espère que vous allez bien. Je suis allé jeter un rapide coup d’œil aux projets de la Game Jam #36 et je n’ai reconnu aucun pseudo… mais passons ! Je ne suis pas venu ici pour vous ennuyer avec mes états d’âme (Éric !) et mes jeux de mots vaseux mais bien pour partager avec vous mon petit projet ; modeste contribution à ladite Jam malgré ma non-participation. Pourquoi non ? Et bien parce que… hum ? Mais si, ça vous intéresse. Sinon pourquoi auriez-vous décidé de consulter ce Devlog ? Bande de petits canaillous.

 

“Regardez ce GIF en jouant le thème de Sonic the Hedgehog dans votre tête… je vous assure, c’est très drôle.”

 

 

Recherche neurones pas trop chers (j’ai un compte PayPal)

Je disais donc : je ne participe pas à cette Jam parce que, dans le village GameCodeur, c’est moi qui tiens le rôle de l’idiot. Si, si.

En fait, je l’avais rejoint au moment de son annonce pour, au final, soumettre mon projet dans les cinq dernières minutes qui précédaient la fin des propositions ; c’est alors que j’ai remarqué un bug en visionnant la vidéo qui devait accompagner le projet. J’ai donc supprimé le fichier mis en ligne pour le remplacer par un nouveau incluant un correctif…

 

 

Résultat : itch.io ne m’autorisait plus l’ajout de fichiers au motif que les votes pour cette Jam étaient en cours et, comme mes neurones avaient visiblement du mal à se connecter ce soir-là, j’en ai conclu que c’était foutu donc je l’ai quitté… sauf que j’aurais très bien pu contourner le problème en proposant un lien externe pour le télécharger, par exemple.

 

Bref… j’ai littéralement fait n’importe quoi…

MAIS !

J’ai décidé de ne pas me laisser dépasser par tout ça, d’où ce Devlog.

😅

 

 

Son nom est Personne

Bon, ce n’est pas que mais quelque chose me dit que vous n’en avez rien à secouer de ma vie – et vous avez bien raison – alors je vais expressément vous parler de mon projet qui n’a pas encore de nom (on l’appellera « le Xème projet que je ne mènerais sans doute pas à terme” ou “LXPQJNMSDPAT”, pour des questions pratiques évidentes).

 

“Freeze! I’m Ma Baker, put your hands in the air, gimme all your money.”

 

L’idée était de réaliser un jeu de tir sur rail dont le gameplay s’inspirerait, un chouillat, du jeu d’arcade Operation Wolf* mais dans un univers plus proche des films de Clint Eastwood que de Sylvester Stallone… un univers de type western, quoi.

* Tu ne connais pas ce jeu culte de Taito ? Ce n’est pas grave : quitte discrètement cette page et ne reviens jamais.**

** Teuh-teuh-teuh ! Chuuuuut… jamais.

 

“Operation Wolf – Arcade – © Taito 1987”

 

Petit descriptif rapide : la caméra défile de gauche à droite tandis que le joueur contrôle un viseur lui permettant de tirer sur les méchants bandits qui tentent de prendre d’assaut un train (en même temps, c’est un jeu de tir sur rail) afin de s’approprier tout l’or qu’il transporte. Vous l’aurez compris, scénaristiquement parlant on frôle la masterclass.

 

. . .

 

Le jeu est très très (très) peu avancé niveau gameplay et je dois bien avouer que j’avais un peu honte de le proposer tel quel. Il faut dire que j’ai eu très peu de temps à lui consacrer (une dizaine d’heures tout au plus) et que j’ai perdu un temps précieux en m’obstinant à peaufiner les graphismes et optimiser le code alors que CE N’EST PAS LE BUT DE L’EXERCICE !

 

“Je vous autorise à user et abuser de ce template.”

 

Je misais pas mal sur la période des votes pour, au moins, ajouter un second type d’ennemi ainsi qu’un écran de Game Over histoire de rendre le gameplay un tout petit peu plus crédible ; surtout en comparaison des autres jeux qui étaient déjà proposés. Je sais bien qu’il ne faut pas se comparer aux autres mais il faut aussi savoir être réaliste.

 

 

…but I didn’t twiddle my thumb(y)s

J’ai tout de même réalisé quelques trucs bien sympas alors suivez-moi, je vais vous faire faire le tour du propriétaire (ça se dit encore, ça ?).

 

Tout d’abord l’écran titre :

 

“Tu connais pas Shéraf ? C’est un groupe, ils étaient number one.”

 

Une étoile de shérif défile depuis le bord supérieur de l’écran ; s’ensuit alors une rafale de six coups de feu – laissant derrière elle des traces d’impact – puis le joueur n’est pas invité à appuyer sur un bouton pour jouer mais je compte sur lui pour qu’il le fasse quand même. On pourrait penser que j’ai gaspillé du temps en voulant intégrer cette petite introduction mais il n’en est rien car c’est en bossant dessus que j’ai conçu la routine me permettant de créer et de déplacer les sprites de grande taille ; et puis, entre nous, ça a quand même plus de gueule que de débuter une partie de but en blanc. À noter que la position des impacts est aléatoire.

 

Vient ensuite l’écran de jeu :

“Pas mal de choses à dire à son sujet donc je vais détailler les différents points.”

 

1) Le HUD (Head-Up Display) :

C’est ici que se trouvent les informations du joueur. Les cœurs – qui symbolisent bien évidement la vitalité – se changent progressivement en crânes quand l’ennemi fait mouche tandis que les balles indiquent l’état du barillet. Le score est également de la partie mais, pour des raisons évidentes de place, j’ai fait en sorte qu’il ne s’affiche qu’après deux secondes d’inactivité pour disparaitre à la prochaine action (ou si le joueur se fait toucher).

 

2) Le viseur :

On le déplace avec les flèches directionnelles pour viser puis tirer sur les bandits (incroyable, hein ?) ou récupérer des bonus… qui n’existent pas (encore). Je me disais que ce serait cool de sélectionner son apparence avant de débuter une partie, voir de proposer un petit éditeur pour le personnaliser. On verra bien.

 

3) Le décor (poteaux électriques et sol) :

Il y a deux poteaux électriques, ils sont dessinés avec la fonction “setPixel » et ils ne se déplacent pas à la même vitesse afin d’accentuer l’impression de profondeur apportée par le scrolling différentiel du sol. Je m’y suis d’ailleurs repris à deux fois pour réaliser cet effet car la première méthode (qui consistait à créer plusieurs sprites pour les déplacer en même temps) engendrait une irrégularité dans l’affichage quand la vitesse de défilement augmentait.

 

4) L’ennemi (le seul l’unique) :

Absence de budget oblige, je n’ai pu me payer qu’un seul et unique figurant pour jouer le rôle de tous les ennemis du jeu. Toute l’astuce réside dans le fait de lui faire contourner la caméra pour rejoindre l’autre extrémité de l’écran et hop ! Ça fait illusion et moi je ramasse les biftons, MOUHAHAHA… ouais, non, en fait, j’ai passé pas mal de temps à le dessiner et, passé la frustration de la transparence des pixels noirs qui gâche un peu le tout, je suis plutôt satisfait du résultat. Il y a même la version alternative pour notifier qu’il a été abattu :

 

“Vivant… »

 

“…refroidi.”

 

Son pattern est relativement simple : il tir sur le joueur de manière aléatoire et il a une chance sur deux de faire mouche (petit détail qui tue : un impact de balle apparait brièvement à l’écran si c’est le cas) puis il revient indéfiniment à l’écran s’il n’est pas abattu ; à l’inverse, c’est un autre ennemi du même type qui débarque deux secondes plus tard.

Alors, autant vous prévenir tout de suite : vous n’aurez pas le temps d’abattre trois bandits que le fun aura déjà foutu le camp alors, s’il vous plait, considérez ce premier jet comme un prototype ou une démo qui n’attends qu’à être amélioré.

🙏

 

Bref, on a vu l’écran titre, on a vu l’écran de jeu, il ne nous reste plus qu’à voir… l’écran de fumé :

“C’est tout pour moi.”

 

 

En conclusion (local inspiration = nil)

Je suis déçu de ne pas pouvoir participer officiellement à la Game Jam mais je suis aussi content d’avoir pu produire quelque chose d’interactif (on ne peut pas vraiment parler de jeu à ce stade), surtout que ça faisait longtemps que je n’avais pas coder quelque chose pour moi et sans aucun rapport avec le développement web.

Téléchargez donc le fichier pour vous faire une meilleure idée et n’hésitez pas à m’en faire un petit retour, c’est toujours intéressant et motivant. Je partagerais avec vous les différentes avancées si avancées il y a car, vous l’aurez compris, j’ai très peu de temps à consacrer au développement de jeux vidéo pour le moment et j’en suis le premier attristé…

Sur ce je vous laisse. Merci de m’avoir lu jusqu’au bout et prenez soin de vous. Moi je m’en vais tester les jeux de la Jam et encourager les participants avec mes votes. À première vue, il y a du niveau donc c’est cool.

 

À bientôt.

Comments (6)

Je suis un des inconnus de la Game Jam, et intrigué de voir un projet Thumby à droite sur le site, soupçonnant un projet hors délai, j’ai cliqué et bingo, mon flair ne m’a pas fait défaut ! :p Me voici donc.

Résultat : itch.io ne m’autorisait plus l’ajout de fichiers au motif que les votes pour cette Jam étaient en cours et, comme mes neurones avaient visiblement du mal à se connecter ce soir-là, j’en ai conclu que c’était foutu donc je l’ai quitté…

Ah mais zut, c’est trop bête : tu n’aurais pas quand même pu re-participer en demandant à David ? Pour ma part, ayant été pris de cours à une minute près, j’ai pu soumettre mes fichiers en lui demandant directement. Pour la participation, je ne sais pas, mais j’imagine que ça peut se régler aussi, non ?
En plus, plusieurs participants ont fourni leur projet même si inachevé, donc il n’y aurait pas eu de souci de toute façon.

j’ai perdu un temps précieux en m’obstinant à peaufiner les graphismes et optimiser le code alors que CE N’EST PAS LE BUT DE L’EXERCICE !

Pour l’optimisation au moins, nous avons le même problème. XD Je trouve que cet exercice en temps court est formateur pour en prendre conscience et mieux contourner la prochaine fois.

Il y a deux poteaux électriques, ils sont dessinés avec la fonction “getPixel »

setPixel, je crois. Oui, tel un compilateur, je relève à une lettre près. 😉

Je m’y suis d’ailleurs repris à deux fois pour réaliser cet effet car la première méthode (qui consistait à créer plusieurs sprites pour les déplacer en même temps) engendrait une irrégularité dans l’affichage quand la vitesse de défilement augmentait.

Bizarre… Techniquement, si la logique est bien séparée de l’affichage en le précédant, ça ne devrait pas se produire. :/ Peut-être est-ce lié au fonctionnement de vThumby en sous-main ? Je ne sais pas du tout.

la transparence des pixels noirs

J’ai remarqué cette limitation forte de setPixel moi aussi et je m’étais dit (pas fait, mais à faire) qu’il est tout à fait possible de programmer une gestion du noir, en prenant en compte la profondeur des images pour gérer la superposition.

Téléchargez donc le fichier pour vous faire une meilleure idée et n’hésitez pas à m’en faire un petit retour, c’est toujours intéressant et motivant.

Vu la description super précise que tu viens d’exposer, j’ai peu de chances de trouver du nouveau, mais je vais jeter un œil. 🙂 J’ai testé tous les jeux de la Game Jam, alors pas de raison que le tien passe à la trappe.

Moi je m’en vais tester les jeux de la Jam et encourager les participants avec mes votes.

Aaaah, voilà pourquoi il y a bien plus que 26 votants, alors !! Un mystère de résolu, j’étais intrigué. XD

Je trouve ton analyse du jeu bien claire et détaillée, en tout cas. 🙂

Merci d’avoir pris le temps de lire mon Devlog et relever la coquille… en bon gros maniaque, j’ai corrigé. 😂

Concernant la participation, oui, il y avait plusieurs possibilités – et passer par David directement en était une – mais j’étais fatigué de ma journée et il était tard alors je me suis pris les pieds dans le tapis et j’ai eu la flemme de me relever, je crois.

Concernant le scrolling différentiel, je pensais la même chose car, en relisant le code, il n’y avait pas de raison que ça se produise et pourtant… la nouvelle méthode est quand même mieux donc ce n’est pas trop embêtant.

Pour les pixels noirs. J’ai réfléchi à un moyen sans toucher au code de la Thumby mais je n’ai pas trouvé… trop compliqué. L’idéal aurait été que la fonction « setPixel » change l’état du pixel (comme je le pensais au départ) alors que là elle ne fait que l’allumer.

Bref, j’essaie toujours de rédiger des trucs assez complets qui peuvent éventuellement faire mouche auprès des néophytes alors je suis content quand quelqu’un le remarque, merci. 😅

J’ai laissé un vote pour chacun des jeux présentés. Si je n’étais pas si débordé en ce moment j’aurais aussi laissé un commentaire à chacun mais bon…

À la prochaine !

Pour les pixels noirs. J’ai réfléchi à un moyen sans toucher au code de la Thumby mais je n’ai pas trouvé… trop compliqué.

D’après ce qu’ont écrit les auteurs de StarBricks, ils ont mis en place un système le permettant, donc il est possible de leur demander voire de jeter un œil à leur code.

Je te soumets tout de même le principe de mon idée : à chaque mise à jour, on réinitialise un tableau de booléens (un par pixel) en les mettant tous à faux, et on s’arrange pour appeler le traçage des images de la moins profonde à la plus profonde. Quand un pixel est considéré comme tracé en opaque (que ce soit en blanc ou en noir), on met son booléen à vrai ; et on n’autorise de tracer un pixel qui si son booléen valait faux.
En encapsulant ce tracé de pixel dans un setPixelBis par exemple, tout devrait rouler. 🙂

Variante : si on ne veut pas tracer dans l’ordre de profondeur, on peut ajouter en paramètre une valeur de profondeur (c’est analogue au paramétrage du mode pour les SpriteBatch de MonoGame), et remplacer les booléens par des valeurs de profondeur (valant par défaut +infini ou équivalent). Le test de tracé (opaque) consiste alors à savoir si la valeur de profondeur du pixel était plus grande que la nouvelle prévue, et si oui, on met à jour sa valeur de profondeur.

Je n’ai pas du tout testé ce système, mais a priori, je suis plutôt confiant dans l’algorithme, ça me paraît logique. Ne te gêne pas pour tenter le coup. 🙂

Je pense que ce système peut fonctionner quand on dessine les sprites avec « setPixel » mais pas avec « Sprite » ou alors il faudrait trouver un moyen de modifier dynamiquement les valeurs que l’on passe dans le « spriteMap » mais ça me parait compliqué.

Je vais déjà commencer par étoffer le gameplay ; pondre un semblant de projet terminé c’est LA priorité pour espérer retrouver la motivation. 💪 Je ne serais pas en retard pour réfléchir à une solution concernant ces fichus pixels noirs par la suite. 🙂

Tintintin !![/Renaud] 😀
Je viens de pondre un chouette truc pour mon propre jeu, et… je crois que ça marche. 🙂
https://mossieur-patate.itch.io/bibliothque-noir-et-blanc-vthumby
C’est l’application directe de ce que j’expliquais plus haut. Reste à vérifier les performances en situation, mais a priori, je suis plutôt confiant.

N’hésite pas à tester ! Le fait que tu en aies eu besoin en plus de moi m’a motivé à « documenter » ma petite bibliothèque proprement, donc tu as eu un bon effet sur moi. 🙂
(Dégoûté de ne pas l’avoir fait pendant le développement de mon jeu, c’était clairement faisable : j’ai réussi ce soir… Mais je suis motivé à aller jusqu’à la version 1.1 ! :))

Ça fait plaisir de lire ce genre de chose. 😃

J’essaie çà dès que possible.

Bien joué !

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.