9 - Les sprites hard

S'il est quelque chose d'extrèmement pratique sur cpc+ se sont bien les sprites hard.

Imaginez:

Sur cpc old, pour afficher un sprite à l'écran et le déplacer, il vous faut sauvegarder le fond; afficher le sprite puis le coup suivant restituer en plus...

Tout cela prend du cpu. Ca peut même en prendre beaucoup.

Pour les sprites hard, une fois le gfx mis dedans, il vous suffit juste de changer sa position (1 ou 2 octets) pour que celui-ci se déplace à l'écran... Pas d'affichage à faire; pas de sauvegarde du fond; pas de restitution :)

9.1 - Généralités sur les sprites hard.

Nous disposons de 16 sprites hard (malheureusement).

Chaque sprite mesure 16 pixels en largeur et 16 pixels en hauteur (soit 256 pixels)

Chaque sprite peut être zoomé en x et en y de façon indépendante.

Chaque sprite est géré par des coordonnées X et Y sur 16 bits.

Les sprites hard on leur propre palette de 15 couleurs et d'une encre transparente pour le masquage, cette palette étant commune à tous les sprites.

Les sprites hard on des priorités. Le sprite 0 passera toujours devant le sprite 1, qui passera toujours devant le sprite 2 etc...

9.2 - ZOOM.

Chaque sprite a un octet de zoom. Le zoom d'un sprite lui est donc réservé et ne modifie pas le zoom des autres.

Comme nous avons 16 sprites hard, nous avons donc 16 octets de zoom.

Voici un tableau des adresses de l'octet de zoom pour chaque sprite:

Voyons maintenant le contenu de cet octet de zoom:

Comme je l'ai dit, on peut régler indépendamment le zoom en X et en Y.

A savoir que si l'un des deux est à 0 le sprite ne sera pas affiché.

L'octet de zoom fonctionne comme suit:

Comme vous pouvez le voir les bits 4 à 7 ne servent à rien (inutile d'y mettre quelque chose, ces bits sont automatiquement mis à 0 par l'ASIC).

Le X et le Y sont chacun codés sur 2 bits. Ce qui nous donne 4 valeurs possibles.

%00 - %01 - %10 - %11

Bien entendu 00 le sprite n'est plus affiché.

La résolution de base d'un sprite hard à son minimum est donc de 1 en X et 1 en Y. A cette résolution, le pixel a la résolution équivalente au mode 2 du cpc (mais en 15 couleurs au lieu de 2).

Le zoom pour chaque valeur X ou Y correspond au double de la résolution précédente à chaque fois.

De sorte si on ne parle que du X, vous aurez avec %01 une resolution de mode 2; avec %10 un pixel 2 fois plus large équivalent au mode 1 et avec %11 un pixel encore 2 fois plus large équivalent au mode 0.

Pour le Y c'est la même chose, vous doublez la taille en Y du pixel à chaque valeur.

9.3 - GFX.

Zoomer des sprites hard c'est bien, encore faut-il qu'il y ait quelque chose dedans.

Pour les SPRH (sprite hard en abrégé), chaque pixel correspond à un octet.

La valeur de l'octet correspond à l'encre. Par exemple si j'écris 1 j'aurai un pixel d'encre 1. 12 un pixel d'encre 12.

Pour rappel, la palette des sprites hard n'a rien à voir avec celle de l'écran et l'encre 0 est l'encre transparente.

Donc votre octet contient une valeur de 0 à 15 (0 à #0F).

Vous avez pour chaque sprite 16 pixels en largeur et 16 pixels en hauteur. Soit 256 pixels par sprites.

Petit exemple pour écrire dans un sprite hard.

Le premier sprite se trouve à l'adresse #4000

Si je poke #01 en #4000 j'aurai donc un pixel d'encre 1 en haut à gauche de mon sprite hard.

Si je veux un pixel d'encre 12 juste en dessous, je ferai donc #4000+#10 (#10 vaut 16) et je pokerai donc en #4010 la valeur #0C (12).

Chaque sprite faisant 256 octets de longeur, on a donc un écart de #0100 entre chaque sprite.

Voici un tableau donnant les adresses pour les données de chaque sprite.

9.4 - Coordonnées.

Les coordonnées des sprh sont fonction du CRTC.

Ce qui signifie que la coordonnée 0,0 se trouve en haut à gauche de l'écran CRTC.

Pour chaque sprh, nous avons une coordonnée X et une coordonnée Y. Chaque coordonnée est codée sur 16 bits.

L'unité de déplacement d'un sprh est le pixel mode 2 (comme par hasard, l'unité de taille minimal du zoom).

Ainsi en X vous pourrez aller de #0000 à #FFFF et en Y aussi.

Pour le X c'est compréhensible car sur 8bits on ne pourrait se déplacer que de 256 pixels ce qui sur un écran de 96*8pixels (768pixels) serait bien ennuyeux.

Pour le Y c'est la même chose même si on ne voit rarement plus de 288 lignes au maximum sur un écran bien chaud... Mais bon, cela permet quelques astuces quand même ;)

Voici donc un tableau récapitulatif des adresses des coordonnées pour chaque sprh:

9.5 - Palette.

La palette des sprites hard se trouve en #6422 et qu'elle commence par l'encre 1. L'encre 0 est TOUJOURS l'encre transparente.

Chaque encre est codée sur 2 octets comme suit (R pour Rouge; B pour Bleu et V pour Vert):

Octet 1:

Chaque composante de couleur a donc une valeur allant de 0 à 15(#0F).

9.6 - Trucs et astuces.

Voici quelques points à préciser:

-Vous pouvez très bien faire des rasters dans les sprites hard.

-Les coordonnées étant prises en compte immédiatement, rien ne vous empêche de les changer en court de route pour faire onduler vos sprites ou pour les déplacer. Ce qui a été fait pour la première fois dans la demo "it was so nice before the crash of the mir station" (demo très minimaliste mais qui mérite d'être citée juste pour cette première). En haut, le logo ZM est composé de sprh qui ondulent et sont rastérisés:

-Le zoom étant pris en compte immédiatement, rien ne vous empêche de le changer plusieurs fois sur le même écran.

-Les coordonnées des sprh étant fonction du CRTC, une rupture CRTC dédoublera vos sprite puisqu'à chacune d'entre elle, la coordonnée Y sera remise à 0. Vous pourrez alors franchir la barre des 16 sprites hard comme je l'ai fait dans ma preview de demo Delirium Tremens ou il y a 32 sprh par ligne en résolution de mode 1 (tout ce qui est bleu étant des sprh).