Les sprites |
Les sprites sont constitués d'un ou plusieurs tiles
de 16x16 pixels, provenant des ROMs C (ou des fichiers .SPR sur NeoGeo CD).
Chaque sprite est en réalité une map (un tableau à une
colonne) , et son affichés sous forme de bandes verticales
de tiles, allant de 1x1 tiles à 1x32 tiles (soit 16x16 à 16x512
pixels).
La largeur des sprites est toujours fixée à 1 tile, seule leur
hauteur peut être modifiée. La NeoGeo est capable de faire le rendu
de 96 sprites par scanline au maximum, et 384 sur tout l'écran.
Bien qu'étant un seul et même objet tennant dans un rectangle de 4x6 tiles, il ne peut pas être constitué que d'un seul sprite. Chaque sprite étant limité à un tile de largeur, il faut en mettre plusieurs côte-à-côte pour créer des objets plus larges. |
Si les 4 sprites étaient séparés de quelques pixels, cet objet ressemblerait à ceci. Quand plusieurs sprites doivent être groupés, ils doivent avoir des numéros successifs (d'où la notation en n+x...). Chacun des 32 tiles pouvant constituer un sprite est modifiable, ainsi que sa palette, son orientation (effets mirroir) et ses caractèristiques d'auto-animation. Les attributs d'un sprite sont: sa position (X/Y), sa hauteur en tiles, sa map, s'il est pilotant ou piloté, et ses coefficients de rétrécissement (X/Y). |
Un sprite est positionné à partir de son coin haut gauche (origine). D'un point de vue performances, la NeoGeo ne fait pas la différence entre un sprite de 1x1 tile et un sprite de 1x32 tiles. La taille (hauteur) du sprite doit être définie. Chaque tile constituant le sprite possède des paramètres qui lui sont propres (effet de mirroir horizontal, vertical, numéro de palette à utiliser...). Certains jeux ne mappent que quelques tiles dans des sprites
qui ont leur hauteur définie comme plus grande, sans raison apparente. Notez bien que les palettes sont individuellement attribuées
aux tiles constituant le sprite, et non au sprite globalement. |
Une fonction très pratique permet de "grouper"
les sprites, pour palier à la limite d'un seul tile en largeur. Par exemple: Notez également qu'un sprite reste un sprite. Ce n'est pas parce qu'il est lié à un autre qu'il ne compte plus comme tel. |
Mélange bordelique des différentes
couches, pour montrer à quoi ressemblent les sprites en bandes
dans un vrai jeu:
On peut voir comment son constitués
les objets en désactivant les sprites un par un dans les "screenshot
factory" de certains émulateurs, comme WinKawaks. Remarque: Il est fréquent de voir
des graphismes qui ne sont jamais affichés à l'écran. Ne JAMAIS utiliser le sprite N°0, c'est un cas spécial dangereux et aucun jeu ne l'utilise. |
SCB1 (VRAM $0000): Map des sprites. 64 mots par sprite. |
Comme il y a 2 mots par tile, et qu'un sprite fait au maximum
32 tiles, une map fait alors 64 mots.
Il suffit dont de faire N*64 pour avoir l'adresse de départ en SCB1 du
sprite N.
Le format des maps est le suivant:
Mots pairs: numéro du tile à
utiliser.
Mots impairs: attributs du tile.
|
Pour trouver l'adresse effective du tile dans les ROMs C (ou le fichier .SPR),
le GPU multiplie simplement le numéro du tile demandé par la taille
d'un tile (128 octets).
Tileset de Mutation Nation, une roue de camion. |
L'animation automatique Le numéro du tile donné dans la map a ses
2 ou 3 premiers bits remplacés par le compteur d'animation automatique. Exemple: Le numéro du tile indiqué dans
la map est 8 (%1000), si il est auto-animé sur 2bits, la séquence
sera la suivante: 8,9,10,11,8,9,10,11,8... |
Exemples de données en SCB1:
#$19C8 puis #$0308 à l'adresse $0000 indique que le premier tile du sprite
0 sera le tile n°$19C8, utilisant la palette 3, auto-animé sur 3
bits.
#$0148 puis #$0916 à l'adresse $0040 indique que le premier tile
du sprite 1 sera le tile n°$10148, utilisant la palette 9, auto-animé
sur 2 bits et retourné verticalement.
#$0149 puis #$2019 à l'adresse $0041 indique que le deuxième
tile du sprite 1 sera le tile n°$10149, utilisant la palette 32,
auto-animé sur 3bits et retourné horizontalement.
SCB2 (VRAM $8000): Coefs de rétrécissement. Un mot par sprite. |
Utiliser #$8000+N pour avoir l'adresse en SCB2 du sprite N.
Contrairement à ce qu'on peut entendre, la NeoGeo ne
sait pas "zoomer" des sprites, mais seulement les rétrécire.
Comme les sprites ont leur origine sur leur coin haut gauche, il faudra les
décaler en conséquence si on veut les rétrécire
depuis une autre origine. Format des mots:
15
|
14
|
13
|
12
|
11
|
10
|
9
|
8
|
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
?
|
Rétrécissement horizontal
|
Rétrécissement vertical
|
Rétrécissement horizontal sur 4 bits ($0F = taille
réelle, se propage pas aux sprite liés)
Rétrécissement vertical sur 8 bits ($FF = taille réelle,
se propage aux sprites liés)
Comme le rétrécissement horizontal ne se propage pas, il faut gérer le rétrécissement des sprites groupés au niveau logiciel (distribution des rétrécissements).
Exemples:
#$0FFF à $8003 laisse le sprite n°3 tel quel.
#$08FF à $801C réduit le sprite n°$1C à 8 pixels de
large.
SCB3 (VRAM $8200): Hauteur et position Y. Un mot par sprite. |
Utiliser #$8200+N pour avoir l'adresse en SCB3 du sprite N.
15
|
14
|
13
|
12
|
11
|
10
|
9
|
8
|
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
496-Position Y
|
Sprite piloté
|
Nombre de tiles dans le sprite (hauteur)
|
Utiliser #((496-Y)<<7) pour laisser le compilateur calculer
la bonne valeur de la position Y.
La position verticale du sprite se fait à partir du haut de l'écran.
Le bit 6 indique que c'est le sprite précedent qui contrôle celui-ci.
Exemples:
#((496-48)<<7)+5 à $8201 donne une position Y de 48 pixels, une
hauteur de 5 tiles, non piloté, au sprite n°1.
#((496-21)<<7)+7+64 à $8235 donne une position Y de 21 pixels,
une hauteur de 7 tiles, piloté par le précedant, au sprite n°$35.
SCB4 (VRAM $8400): Position X. Un mot par sprite. |
Utiliser #$8400+N pour avoir l'adresse en SCB4 du sprite N.
15
|
14
|
13
|
12
|
11
|
10
|
9
|
8
|
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
8+Position X
|
?
|
Utiliser #((8+X)<<7) pour laisser le compilateur calculer
la bonne valeur.
La position horizontale du sprite se fait à partir du bord gauche de
l'écran.
Exemple:
#((8+35)<<7) à $8401 donne une position X de 35 pixels au sprite
n°1.