1

Salut

Je pose ici ma production de la speed-coding de l'AC 2016 (hors concours) : Danse Lapinou, Danse !
Thème de la convention : Fêtes de Pâques
Contrainte : A la manière d'un Game & Watch
Contrainte du samedi : seulement 2 touches directionnelles et un bouton d'action
Plateforme : Mega Drive EU (testé sur le hardware)
Etat d'avancement : jeu non terminé
Description :
Le jeu reprends le concept du Simon d'Hasbro.
Au lancement du jeu Lapinou danse en effectuant une suite de 5 mouvements (dont 3 différents) qu'il faut reproduire ensuite reproduire.
Gauche : Lapinou tape du pieds qui est à gauche (son pied droit donc puisqu'il nous fait face wink )
Droite : Lapinou tape du pieds qui est à droite.
Action : Lapinou nous montre son ...

Il est loin d'être terminé en l'état, ce n'est même pas vraiment un jeu puisque suite à la danse de démonstration de notre protagoniste, on peut le faire danser comme on veut sans que les entrées ne soient prises en compte.
Capture de la séquence de danse au démarrage du jeu :
595740postmortem01.png
Suite à l'appui sur le bouton gauche :
583938danse.gif
Bouton droit :
557584postmortem04.png
Bouton A :
367315postmortem05.png

Télécharger la ROM (et les sources, attention c'est moche :P )

J'en profite pour faire un petit postmortem de cette speed-coding et de ma découverte du dev sur MD :

I - Éteignez vos tablettes et remontez vos appareils :
Premièrement, cette année je participais à l'organisation, en étant à l’accueil le samedi je savais dès le début que mon temps de code allait être réduit.
Ma volonté pour ce week-end était de découvrir le développement sur cette plateforme, mais aussi la machine en elle-même (combien de sprites simultanés, combien de plans de backgrounds, etc ...).

Deuxièmement, je suis arrivé les mains dans les poches. J'ai juste installé le SGDK de Stef sur mon portable, vérifié que mon EverdriveMD fonctionnait et jeté un rapide coup d’œil au wiki et aux samples* du SGDK (* : exemples de codes livrés avec le kit de développement. Ici joytest, sound et sprite, cube_flat, ...).
Et c'est là que j'ai pêché par orgueil, en lisant les sources du sample sprite, j'ai vu que le fichier renfermait les appels vers les méthodes d'affichage de sprites, de map, de son et d'input : PARFAIT !
Exactement tout ce dont j'ai besoin en speed-coding pour réaliser une petite production. Mon C est un peu rouillé mais en farfouillant dans la doc (générée via doxygen) et les autres samples je devrai m'en sortir.

Et bien NON !

II - Back to the Future :
Avec les dernières productions sur PC-Engine (en collaboration avec Bjorn) je pensais m'être remis doucement au C, et je pensais faire de même sur MD.
Quelle désillusion ... mais pour le mieux. En fait le SGDK utilise GCC (un compilateur C) non modifié (enfin d'après ce que j'ai pu voir). Cela implique donc l'utilisation du langage C non restreint, à l'inverse du compilateur pour PC-Engine; Huc, qui lui est capable d'interpréter une version allégée de la grammaire du C (pas de struct, typage restreint, ...).
J'ai donc eu du mal non pas à comprendre le code des exemples mais à le mettre en pratique.
N'étant plus habitué à travailler avec une telle diversité de types de variables, je me suis rapidement perdu dans les entiers signés, non signés, de longueur 8, 16, 32 bits, etc ...
Le principal inconvénient a été de ne pas pouvoir faire de sorties texte à l'écran avec les valeurs de variables pour debuguer mon code.

Heureusement, des bribes de cours de C me sont revenus et grâce à la doc du SDK j'ai pu m'en sortir un peu.
Je retrouvais petit à petit mes marques et les divers messages du genre "error : pointer used when fix32 is expected" s'affichaient de moins en moins.
Ces satanés pointeurs et passages de référence, la bête noire des devs débutants revenait me hanter une fois de plus smile
Digression de développeur
Dans la série je suis une méthode qui va te détruire mentalement, je nomine Fix32ToInt.
Elle est utilisée inline dans les samples, donc on s'attend à pouvoir en faire de même avec les autres méthodes de conversion : réponse NON !
Je me suis arraché les cheveux à vouloir sortir des données à l'écran pour debug, la méthode affichant du texte ne prenant en paramètre que des chaînes de caractères, il fallait donc "caster" les variables.
J'ai essayé de mémoire la syntaxe (type)variable, sans succès alors j'ai entrepris d'utiliser les méthodes de conversion. Par exemple uintToStr, en l’appelant inline.
WRONG ! Elle n'est pat définie de la même manière que Fix32ToInt, et donc ne peut être utilisée inline ... ça m'a frustré tout le week-end.Bref, revenons à nos moutons.

III - Je suis une fusée
Après une bonne nuit de sommeil sur le sol de la salle et quelques verres de divers breuvages, mon esprit était plus clair le dimanche matin.
Après un échange la veille au soir avec Stef sur la manière dont sont gérés les inputs, j'étais de retour en piste.
Première étape, tout supprimer. Ca peut sembler dommage de jeter des heures et des heures de code et de debug à la poubelle, mais ce qu'on jette réellement ce sont des heures de prises de tête, de copier/coller de code sans queue ni tête et de frustration (roh l'autre avec sa philosophie de comptoir).

Off to a new start, j'ai commencé par faire des graphs, ça vide la tête et c'est bon pour le moral d'avoir quelque chose de concret à afficher.
J'ai donc commencé par des sprites à animer qui représentent le D-Pad et les boutons d'actions. Ensuite, le fond.
Et c'est là que la magie du sub-conscient opère. Après une bonne heure passée à faire les graphismes, mon cerveau fonctionnait en tâche de fond et avait ré-organisé tout le travail de la veille en une suite d'étapes simples à suivre et à coder :
1 - importer le fond
2 - ajouter les sprites des touches
3 - gérer les pressions des touches
4 - relier les points 2 et 3 pour animer les sprites
5 - afficher le perso central et du texte pour les instructions (griffonnage en 2 minutes de Lapinou, désolé pour lui, il est vraiment laid).
6 - relier les points 3 et 5 pour animer les sprites
7 - faire une méthode qui génère une séquence aléatoire de 5 mouvements en utilisant les 3 de base
8 - faire jouer cette séquence au perso central
9 - récupérer les inputs du joueur et les limiter à 5
10 - comparer à la séquence initiale et sortir une condition WIN ou LOOSE

Par manque de temps je me suis arrêté au point 8 (et la séquence initiale pour des besoin de debug n'est pas aléatoire).
Pour vous faire une idée, j'ai tout jeter vers 12h00 et j'ai bossé jusqu'à 15h30.

IV - To boldly go where no one has gone before
Pour résumé, je suis très content de cette première approche du SGDK, pas vis-à-vis de la prod finale mais plutôt de la compréhension que j'en ai désormais.
Attention, je suis très loin d'en comprendre tous les rouages, certains fonctionnement comme celui des touches ne m'est encore pas familier, et je n'ai pas du tout explorer les propriétés des sprites et des maps comme les palettes, les flips ou les tileset.

Mais le kit permet assez rapidement de réaliser des affichages de backgrounds, de sprites et de MUSIQUE !
C'est la grosse différence avec l'interpréteur/compilateur Huc pour PC-Engine et qui nous a embêté avec Bjorn, il n'y a pas de gestion de sons dans le kit de développement.
A l'inverse celui de la Mega Drive permet de charger un moreau si facilement que s'en est déconcertant (enune seule instruction).
Workflow : ouvrir DefleMask, composer ou charger un .dmv, sauvegarder au format .vgm et hop, le tour est joué.
D'ailleurs je vous recommande de charger la rom du sample sound qui montre le grand nombre de formats sonores pris en charge.

Suite à cette expérience positive, je vais réviser mon C et m'attaquer à nouveau à la machine.

V - ....e e.............s..!
.......r........t.......g
...G.............i n...........


* AssoRGC : pour organiser la speed-coding (et en me laissant beaucoup de temps pour profiter de l'évènement)
* Bjorn a.k.a Bjornidas : qui m'a alimenté en Dinosaurus et Bushmills et qui a réussit à produire un jeu NES tout en organisant la speed-coding !
* KanedaFR: qui tient un forum actif pleins de ressources pour le dev MD et qui m'a donné envie de me lancer sur Genny wink
* Stef : pour avoir réalisé un SDK accessible et complet et ses précieux conseils (et puis 1st place au passage wink )
avatar
nope

2

top
Sinon, y'aura un roman relié avec la version collector lors de la sortie physique?
avatar

3

Trop bien ^^
GG !
Bjorn (./2) :
Sinon, y'aura un roman relié avec la version collector lors de la sortie physique?

mdr need
avatar
@originalfei
Homebrews Connexion
In pixels we trust.
ORE WO DARE DA TO OMOTTE YAGARU !

4

hyper intérressant, mais décourageant car comme toi, je développe désormais sur des outils qui ne me font pas chier avec les typages! (malheur, on se fait vieux!)
avatar
https://air-gaming.com/tests/ si vous voulez de la bonne lecture :=)

5

Bjorn (./2) :
topSinon, y'aura un roman relié avec la version collector lors de la sortie physique?
Et avec la version ultra collector une boite de chocolats Bjornidas.

Et pis tiens, joyeux anniversaire au passage.
avatar
nope

6

manoloben (./4) :
hyper intérressant, mais décourageant car comme toi, je développe désormais sur des outils qui ne me font pas chier avec les typages! (malheur, on se fait vieux!)
Zut, je ne voulais pas décourager celles et ceux qui voudraient se lancer.
Mais il est vrai qu'on s'habitue (trop) vite au confort des langages non/peu typés tongue
avatar
nope

7

Excellent smile J'adore la dernière posture du lapin tongue
Ca fait plaisir aussi d'avoir ton petit retour sur l'utilisation de SGDK, c'est vrai qu'il faut clairement une bonne maitrise du langage C quand même pour l'utiliser efficacement, derrière c'est un pur GCC.
Même si dans SGDK j'ai redéfini les types de base en u8/u16/u32, s8/s16/s32 pour une écriture plus lisible, tu es quand même sur du vrai C. L'avantage étant que le code peut être éventuellement ré-utilisé sur d'autres kits se basant aussi sur le C (le code logique, car la partie GFX & SFX est propre au hardware).
Aussi ce week end en participant à la coding avec Fab et ZZZzzz, je me rends compte que l'utilisation de SGDK (et de son système de ressource) n'est pas toujours des plus évidents, on a bien galéré pourtant je suis l'auteur de cette lib ^^ Combien de fois j'ai pensé que la lib avait un bug alors que c'était un bug à la c** dans mon code... pour le coup tant mieux, l'inverse serait pus génant (mais ça arrive aussi).
En tout cas je serais ravi de t'aider à prendre la main sur SGDK si tu en as besoin wink
avatar

8

Cool merci.
J'ai hâte d'avoir un peu de temps libre pour m'y mettre top
avatar
nope