45Fermer47
RogerBidonLe 08/05/2019 à 01:40
Mise en route de la v2, refonte des coordonnées

Maintenant que les cartouches de Super Tilt Bro. sont toutes livrées, il est temps de commencer à préparer la version 2. On commencera par s'attaquer aux gros chantiers d'architecture. Il faut faire disparaître les limitations de la v1 avant de faire un meilleur jeu. Commençons par le système de coordonnées.

La NES affiche des images d'une résolution de 256x240. Pratique! On peut décrire n'importe quelle position de l'écran en deux octets : un entier 8 bits non-signé pour la composante horizontale et un autre pour la composante verticale. Dans Super Tilt Bro. sortir de l'écran c'est mourir, la v1 est donc basée sur ce système simple d'un octet non-signé par composante.

Pour certains objets qui ont besoin de plus de souplesse, comme les personnages, on peut utiliser un deuxième octet que l'on nommera sous-pixel. On forme ainsi un nombre à virgule fixe, permettant de placer l'objet plus précisément et donc de lui donner une vitesse plus précise. On peut, par exemple aisément déplacer un personnage d'1.5 pixels par frame.

yiC6

Ce système fonctionne bien, mais a posé deux problèmes.

Le premier, technique et contournable, est le mélange ingrat d'entiers signés et non-signés. En effet, si on a deux points sur l'écran, soustraire les composantes de leurs positions permet d'obtenir un vecteur... Du moins d'après mes cours de math, car avec ce système on soustrait deux nombres non-signés. Ça se passe bien tant que le résultat est positif, mais un résultat négatif produit un overflow. On s'en sort toujours, mais c'est parfois galère.

Le deuxième problème, lui n'a pas pu être contourné et la v1 a dû sortir avec : si on est autorisé à sortir légèrement de l'écran avant de mourir, le jeu est plus agréable manette en main. Avec ce système de positionnement bien ancré partout dans le jeu (personnages, hitboxes, plateformes, particules,...), on ne peut pas simplement ajouter "vite fait" la notion de "hors de l'écran" pour mettre en place cette fonctionnalité. Super Tilt Bro. v1 ne comprend pas du tout la notion de "en dehors de l'écran". Quand on lui en parle, il est largué. D'ailleurs, pour lui on ne meurt pas "en sortant de l'écran" (ça ne veut rien dire), mais "si en se déplaçant vers la gauche, on finit à droite de notre position d'origine".

Pour résoudre ces deux problèmes, on change le système de coordonnées. Au lieu d'utiliser un octet non-signé par composante, on utilise cette foi un entier signé sur deux octets. On appelle l'octet de poids fort l'octet d'écran et l'octet de poids faible l'octet de pixel. Bien sûr pour les objets qui ont besoin de la précision supplémentaire on peut toujours ajouter un octet de sous-pixel

T5mE

Ce système permet donc de régler le mélange d'entiers signés/non-signés et de faire sortir les personnages de l'écran. C'est une belle victoire. En prime, on dispose de vraiment beaucoup de place. Un octet pour l'écran, ça fait 256 écrans. Si un jour on voulait implémenter un mode aventure, basé sur du scrolling, ça serait envisageable.

Forcément, ce changement à un coût. Stocker des positions demande plus de mémoire et les manipuler est plus gourmand en CPU. Heureusement pour le CPU, lors du refactoring des animations une grosse optimisation est passée, bien plus impactante que quelques additions sur 16 bits.

Ce changement a été fait dans le cadre d'un mini marathon pendant les ponts du mois de mai. Vous trouverez la ROM résultante ici : http://supertiltbro.wontfix.it/files/preview/Super_Tilt_Bro_marathon(E).nes

N'hésitez pas à me faire des retours à propos de l'impact sur la jouabilité, ou des rapports de bug.

Aussi, durant ce marathon, j'ai reporté mes progrès quotidiennement sur Twitter. Dites moi si le format vous plait. J'en referait certainement d'autres car j'y ai pris un pied incroyable.