Projet sur Game Gear

Car il fallait bien une suite logique à ces expérimentations sur le pixel-art… J’ai lu pas mal de doc dernièrement sur le VDP, j’ai analysé la VRAM de la machine pour mieux comprendre et ce soir j’ai suivi un tutoriel fort bien réalisé, et je l’ai bricolé vite fait pour avoir un rendu Game Gear.

Je n’ai pas l’intention de faire un jeu pour l’instant. Par contre, j’ai très envie de faire afficher mes scènes de combats de Phantasy Star II, pour voir ce qui passe ou non.

J’ai compris pas mal de trucs, mais il y a encore du travail. Pour info, j’ai déjà une expérience de dev en assembleur.

20220202_225506

2 « J'aime »

Bravo , ça donne envie de s’y mettre aussi !!
Impatient de voir ce que tu vas faire avec :slight_smile:

1 « J'aime »

Bon progrès ce soir…

20220203_223955

J’ai pu charger mon décor sur la console et ça fonctionne.
Et dans l’émulateur :

Capture

6 « J'aime »

Ça s’annonce passionnant à suivre !

Classe

J’ai pas mal mis au propre mon code, j’utilise la pile et j’ai pigé comment utiliser la RAM.

Après, c’est vraiment trop primitif comme type dev, je ne pense pas que j’aurai la patience de faire grand chose dessus. Le Z80 ne propose même pas une commande de multiplication, il faut coder le truc soi-même.

Faire des boucles c’est également la croix et la bannière. On passe sa vie à jongler avec 4 pauvres registres et c’est très chiant.

J’ai pu faire des méthodes dédiées pour afficher le nom du monstre en haut et mon décor, mais pour ce dernier, pas moyen d’implémenter un algo simple qui boucle en avançant dans les adresses mémoire à écrire. Quand je vois les efforts à fournir pour quelque chose d’aussi simple, je me dis que les développeurs d’époque ont du passer un temps monstre à bricoler des utilitaires et méthodes pour simplifier leur travail. Mais je n’ai pas un temps infini, c’est juste un passe-temps.

Je verrai pour pousser des sprites à l’occasion, pas sûr d’aller plus loin par contre.

Je suis impressionné ! Des langages j’en est vu mais l’assembleur j’en ai jamais vu.

Après une rapide phase de déception face au mur que représente le codage en assembleur (je pense que je manque d’outils et de méthodes), il y a visiblement des solutions viables pour coder en C sur Master System. Je vais m’y pencher, je pense pouvoir très facilement adapter ça à la Game Gear, et je redévelopperai ce que j’avais fait en C.

A suivre…

1 « J'aime »

Bon super nouvelle, après une soirée de boulot j’ai un environnement de dev fonctionnel en C, un projet qui compile et j’ai pu refaire le Hello World dans ces conditions. Il est fonctionnel sur la machine.

J’ai eu quelques galères pour tout mettre en place, mais avec le devkitSMS à disposition, ça va largement simplifier les opérations. Il y a de quoi bosser sur Game Gear également, c’était assez simple à configurer.

J’essaye de transposer mon décor et de mettre des sprites prochainement, ça sera bien plus simple…

Capture

Niveau code en C c’est vachement plus simple ça change tout… Et si en assembleur j’avais quelques notions, en C j’ai de bons restes.

3 « J'aime »

Avancement du soir… Coder en C c’est presque de la triche :slight_smile:

Capture

J’ai réussi à pousser mes noms de monstres, de personnages et le décor. Tout est géré avec des fonctions dynamiques, je peux donc changer facilement de monstre, en passer 1 ou 2. Idem des personnages, je peux afficher une équipe incomplète, et ça remplir les cases inutilisées automatiquement avec du noir.

Pousser le décor en 2 boucles c’est plié. L’exemple typique du truc ultra chiant à faire en assembleur avec 3 pauvres registres, que je fais en quelques lignes ici.

Capture

A venir : les HP. Puis je passe aux personnages avec des sprites.

3 « J'aime »

Bon progrès je trouve sur le décor et le monstre, avec quelques ajustements. Il me reste à les passer sur la console…

Capture

Je suis passé sur 6 couleurs pour le décor, et donc 10 sur le dragon. Je trouve que ça arrange beaucoup la présentation en donnant plus de perspective au décor. Les teintes sont volontairement semblables car il faut du contraste pour que les ennemis ressortent.

Le dragon a surtout perdu au niveau des cornes, mais le résultat final reste convaincant je trouve. J’ai fait ressortir ces dernières avec un liseré noir, et j’ai ajouté une ombre. Si j’arrive à faire afficher ça à la console ça sera la classe ^^

2 « J'aime »

J’aime beaucoup le rendu, le dragon rend très bien et le décor est suffisant :+1:

1 « J'aime »

ouais super idée le changement de couleur sur le décors, c’est très efficace.
Le rendu globale est impressionnant

1 « J'aime »

J’en suis là ^^
Il faut que je réussisse à fusionner le décor et le dragon. Il va falloir faire des bidouilles !

Capture

1 « J'aime »

Pour fusionner le décor avec le dragon, vu que tu bosse avec 10 couleurs, t’as qu’une seule solution, intégrer ton dragon dans ton décor et utiliser un tile set avec le dragon déjà intégré.
Pour utiliser le trick de golden axe ou mortalkombat, il faut pas utiliser plus de 7 couleurs et en garder aussi 7 de dispo sur la palette des sprites

1 « J'aime »

Ce n’est pas comme ça que ça fonctionne. Le nombre de couleurs n’a strictement aucune importance. Si tu veux fusionner un élément dans le décor, la seule contrainte c’est que l’ensemble des couleurs soit disponible dans la même palette. En l’occurrence, la palette BG. Mais techniquement, on pourrait le faire avec la palette SPRITE, même si j’ai du mal à voir l’utilité. Je fusionne le dragon dynamiquement, je n’ai pas eu besoin de dessiner des tiles avec le décor intégré derrière.

Le décor peut avoir 4 couleurs et le monstre 12 tout comme le décor peut avoir 12 couleurs et le monstre 4, ça marchera strictement de la même manière.

J’ai réussi à le faire d’ailleurs, voici le résultat :

Capture

C’était relativement compliqué par contre. Je dois traiter chaque pixel individuellement afin de décider si j’affiche celui du décor ou du dragon. Sachant que le décor réutilise de nombreuses fois les mêmes tiles, je dois parcourir la tilemap pour trouver celui qui doit s’appliquer derrière le dragon. Certaines sont également en « reflet », et je dois appliquer le reflet manuellement dans ce cas. Enfin, la façon dont l’information des pixels est stockée rend les opérations encore plus complexes, mais je vous passe les détails.

Bien content du résultat.

2 « J'aime »

Très intéressant ce thread, en tout cas t’as une sacrée patience.Bon courage pour le suite.

1 « J'aime »

Progrès du soir…

Toujours du refactor du code et des optimisations. J’ai fait des méthodes pour afficher les HP des personnages (il y a des règles pour ne pas afficher des 0 inutiles, entre autres…). J’ai également retravaillé encore le décor, je n’aimais pas l’aspect granuleux. Ce que je voulais exprimer, c’était un environnement futuriste propre, donc le « dithering » n’avait pas de bonne raison d’exister.

Capture

J’ai aussi passé l’affichage dans la boucle de gameplay. Ça n’a pas posé de problème. Mais bon, je suis loin d’avoir un truc jouable lol.

Je vais finir par avoir des soucis de « bank » également. Je ne sais pas comment je vais devoir gérer cet aspect-là, mais en gros le code est adressé par paquets de 32K et j’en ai rempli 40% là. J’espère que c’est automatique sinon je vais pleurer… :confused:

3 « J'aime »

Chargement et positionnement d’un sprite cet aprem. J’ai découvert un truc de plus du coup, car je n’avais pas encore touché aux sprites jusque-là. La façon d’indiquer leur position et quelle image utiliser n’est pas contigüe en mémoire, encore une fois ^^

Mais bon, on finit par comprendre.

Capture

Il me reste à ajouter le sort, voir si ça se superpose comme je veux. Ensuite, je pourrai essayer de faire une animation, à voir…

Edit : j’ai implémenté une animation basique et tout fonctionne.

Capture

5 « J'aime »

J’ai continué de me faire des classes utilitaires et je peux désormais afficher très facilement les monstres que je veux sur trois positions possibles (gauche, milieu et droite). En gros, un unique monstre ça sera au centre, et deux monstres ça sera gauche + droite.

J’ai fait en sorte que tout soit homogène donc la gestion est exactement la même pour tous les monstres, du coup le processus pour ajouter et afficher de nouveaux monstres est ultra simple.

Capture
(oui Rolf tire au milieu lol, et j’ajouterai une ombre)

J’en ai ajouté un nouveau, j’ai passé un peu de temps pour arranger le pixel-art et les couleurs à mon goût. Contrairement à avant, j’ai optimisé mon processus d’affichage pour ne plus avoir à stocker dans la ROM les 64 tiles de chaque monstre : toutes celles qui sont vides sont retirées. Par contre ma façon de traiter la fusion avec le décor fait que je ne peux pas utiliser le mécanisme de « symétrie ». Ça serait trop compliqué.

Je vais surement opter pour des monstres qui vont avoir une palette commune par contre, si je veux en afficher deux différents. Car descendre à 5 couleurs, c’est trop faible et ça jure avec le reste. Il faudra être un peu créatif !

L’affichage des monstres est un peu long aussi, il faut que je vois si je peux gagner d’une façon ou d’une autre mais ça me parait compliqué. Ma méthode a déjà été ultra factorisée. Mon souci c’est que je dois itérer sur tous les pixels un par un, je n’ai pas le choix. Donc ça prend du temps… J’ai cependant 2 idées à essayer de mettre en place, à suivre…

Edit : et voilà le boulot avec deux nouveaux monstres, que j’ai fait cohabiter sur une seule et même palette.

Capture

J’ai retravaillé le Locust qui était trop grand et je suis content du résultat. Je l’ai entièrement réduit à la main.

5 « J'aime »