EN COURS
Après un jeu PS Vita me voilà à faire un jeu PlayDate ! Pour celleux qui ne savent pas la playdate c'est une petit console jaune, avec un écran noir et blanc et une manivelle (oui !). Ça fait un moment que j'en ai une, j'y ai joué un peu, j'ai fait le Lucas Pope sorti dessus, et puis après j'avoue elle est partie prendre la poussière. Néanmoins j'avais toujours dans un coin de la tête de faire un jeu dessus...
Lors du Lyon Game Dev de janvier, je discutais avec Ludo qui fait des jeux sur playdate justement (il a sorti Crank Stone recemment), et il me disait que la mode en ce moment c'était les jeux en 3D. Là mon cerveau s'est dit : et si on essayais ????? J'ai très vite fait le lien avec une envie vague que j'avais dans un coin de la tête de créer un clone de SpeedX 3D.
L'étape 1 c'était de regarder comment on fait de la 3D sur playdate, j'ai trouvé ce billet de blog trop bien qui justement récapitule toutes les façons de faire. Arrivé vers le bas de la page est listé Mini3D qui fait partie de l'API offcielle de la PlayDate.
Étape 1 : faire un cube. J'ai repris la démo 3D en lua qui est dans le SDK de la playdate, et je l'ai modifiée pour faire apparaitre un cube que je fais tourner avec la manivelle. Ça m'a permis de me remettre en têt les base de la 3D (notamment l'ordre des points d'un triangle!)

J'hésite à représenter le joueur, dans SpeedX3D il n'y est pas, mais je me dis que quand même ça peut prendre plus clair. Du coup je voudrais bien un genre de vaisseau triangulaire proche de la caméra sur le tube. J'ai fait un premier test en en faisant un node à part (via mini3D), mais je ne comprend pas bien pourquoi ses coordonnées ne correspondaient pas à celle du tube, au final je fais un second essai en dessinant direct le player sur le même noeud que le tube. C'est interessat ça me permet de comprendre le code de génération du tunnel (que j'avoue j'ai copié collé de XScreenSaver 😇)
Je viens de découvrir l'option pour draw en wireframe, le rendu est tellement mieux. Seulement ça ne prend pas en compte orderTable donc je réécris la lib pour que ça le fasse. J'ai réussi, ça m'a permis de corriger le wireframe qui se faisait pas en noir, le rendu est bien stylé maintenant, je suis content.
Pour le player en lui même, mes essais ne sont pas concluants, je voulais un genre de pyramide collé contre la paroi et j'arrive pas à avoir cet effet, j'ai envie de voir si faire comme SpeedX3D (la camera c'est le player) je m'en sortirai mieux.
J'ai réussi à faire en sorte que la camera soit sur le tube et avec la manivelle je la tourne. Par contre j'ai un soucis, les faces se clipent trop facilement quand un seul de leur vertex passe derrière la camera, je tente de bidouiller ça. Pas facile, je suis descndu jusque dans le draw fragment sans trouver qui était à l'origine de ce comportement. Bon déjà la camera comme joueur ça marche, par contre j'ai divisé par deux mon framerate sur playdate, faut que je vois comment optimiser.
Dans un premier temps je sidetrack: j'ai trouvé comment optimiser, je rend les portions de tunnel lointaine (donc culled la plupart du temps) avec moins de faces, j'ai un 30 fps constant (ça me semble une bonne target). Ensuite j'ai regardé si je pouvais changer la couleur des sections du tube pour en faire des sombres (un peu comme dans les toboggan aquatique quand il fait noir!), pour la couleur c'était facile mais le wireframe il fallait le passer en blanc. J'ai donc encore touché à des choses directement dans le sdk, maintenant la couleur du wireframe est décidé dans la face et non plus dans la shape. Ça marche !
Bon, les obstacles... Je sais pas trop pas quel bout le prendre, va falloir que j'instantie de nouvelles shapes, je vais 100% avoir à nouveau des galères avec la mémoire... Déjà je vais essayer d'en draw 1, de me mettre au bon endroit dans la boucle de dessin du tunnel. Ok j'ai réussi un premier truc :

Il faut rajouter set -gx PLAYDATE_SDK_PATH /run/media/paul/Developpement/Gamedev/playdate/PlaydateSDK-3.XX/ dans la config du shell (moi c'est fish, donc dans .config/fish/config.fish), il faut aussi que je change mon run.sh avec le nouveau chemin (peut-être que je pourrais aller le lire dans le path si j'étais malin).