Le décor file, et le HUD avec lui

Sur STe, le défilement se fait avec un seul réglage matériel : il décale l'image affichée de zéro à quinze pixels vers la gauche, le temps que la caméra franchisse une case. C'est ce petit décalage qui rend le scroll fluide, en complément du grand saut d'une case à l'autre.

Le piège, c'est que ce réglage agit sur l'écran entier. Il ne sait pas faire la différence entre la zone de jeu et le HUD posé tout en haut, celui qui montre les cœurs de vie, le score, la jauge de lanterne et les vies restantes. Tant que ce bandeau était une simple bande noire, personne ne voyait qu'il glissait lui aussi. Le jour où j'y ai remis le vrai contenu, le HUD s'est mis à coulisser de quelques pixels à droite et à gauche au rythme du scroll. Un HUD qui bouge avec le décor, c'est exactement ce qu'on ne veut pas.

Seize copies, une par décalage

L'idée du correctif est de retourner le problème. Puisque le matériel va décaler tout l'écran de N pixels vers la gauche, je prépare le contenu du HUD déjà décalé de N pixels vers la droite. Les deux décalages s'annulent, et le bandeau retombe pile à sa place.

Le souci, c'est que N change à chaque image, et prend toutes les valeurs de zéro à quinze, parce que la caméra avance au pixel près. Je prépare donc seize versions du bandeau, chacune décalée d'un cran de plus que la précédente. À chaque image, je regarde de combien le matériel va pousser l'écran, et je choisis la version qui compense exactement. Le bandeau paraît figé pendant que le décor file dessous.

Ce qui rend l'astuce viable, c'est son coût quasi nul. Une fois les seize versions préparées, choisir la bonne à chaque image ne demande presque rien : aucun calcul, aucune recopie. Et la mémoire de ces seize copies, je la prends dans une zone déjà réservée au scroll, donc le jeu ne grossit pas et continue de tenir dans son mégaoctet, sur STe comme sur STf.

Mettre à jour sans tout refaire

Quand on prend un coup ou qu'on vide la lanterne, le HUD change. Refaire les seize copies en entier à ce moment-là provoquerait un clignotement très visible, le bandeau se reconstruisant version par version sur plusieurs images. La leçon, je l'avais déjà apprise en chassant un vilain défaut similaire plus tôt dans le projet.

Alors je ne touche qu'à l'élément qui change. Un cœur qui se vide, un cran de jauge qui s'éteint : je redessine ce petit morceau, et lui seul, dans les seize copies d'un coup, en une seule image. Le score et les vies ne bronchent pas, et le changement passe sans le moindre scintillement.

Le hoquet d'une seule image

Première version en main, le bandeau affichait bien son contenu, les cœurs réagissaient proprement aux dégâts, rien ne débordait. Mais en me déplaçant, le HUD avait des hoquets, des clignotements. De temps en temps, un petit sursaut, comme s'il sautait d'un pixel avant de se rattraper.

La cause tient à un détail de timing que j'avais bien pris en compte ailleurs sans y penser ici. Pour éviter un autre défaut, j'applique le nouveau scroll au moment très précis où la nouvelle image apparaît à l'écran, pas avant. Or je changeais la copie du HUD un poil plus tôt, sans attendre ce même instant. Pendant une image, le bandeau montrait déjà sa position suivante alors que le décor, lui, affichait encore la précédente. Le décalage entre les deux durait juste une image, mais il revenait par intermittence, d'où ces hoquets.

Le correctif consiste à faire patienter le changement de copie jusqu'à l'instant exact où le scroll bascule. Désormais, le bandeau et le décor changent ensemble, à la même image, jamais l'un sans l'autre. Le HUD est redevenu parfaitement immobile.

Le bilan

Le HUD tient maintenant en haut de l'écran, cœurs, score, jauge de lanterne et vies, parfaitement fixe pendant que le décor scrolle à pleine vitesse dessous. Les dégâts et les recharges se voient sans clignotement, et il n'y a pas une ligne parasite sous le bandeau. Le tout sans rien coûter au framerate, et toujours dans un seul mégaoctet.

La morale tient en une règle que je me note pour la suite : avec ce genre de scroll appliqué au dernier moment, tout ce qui est lié à l'image, le décalage du décor comme le choix de la copie du HUD, doit basculer au même instant précis.

La version courante du jeu est téléchargeable ici en disquette .st. Monte-la comme disquette A dans Hatari, en mode STe pour le scroll matériel, ou en mode STf pour le scroll logiciel : c'est le même fichier, il détecte la machine au boot. Pour la version courante du jeu, voir aussi la page d'accueil.