philip-lynxLe 09/11/2012 à 12:39
Maeel (./2) :
Pas compris la ...
Au passage tu veux dire quoi par "declaration multiple" ?
là:
Fadest (./7) :
Pas vraiment un exemple, ni un tutorial, mais avec ça, tu devrais pouvoir t'y retrouver :
Pour la partie inits, il te faut déclarer les éléments suivants et la fonction init_sprites()/// on a besoin de stdlib pour bcopy() de mémoire
#include <stdlib.h>
// SCB est un tableau de 26 sprites de 11 octets chacun
extern char SCB[25][11] at (0xfff8-16320-25*11);
// spr0 est le "modèle" de sprite de 11 octet pour initialiser une occurence de SCB2[]
extern char spr0[11];
// init_scb est le premier sprite à afficher, en fait, il pointe sur un sprite vide
// j'aurais aussi pu le faire pointer vers le background
// l'important dans le _init_scb, c'est dc.w _SCB2
// qui fait pointer le sprite suivant vers le premier du tableau SCB
extern char init_scb[23];
#asm
; init_scb est utilisé pour initialiser les registres du SpriteEngine
; avec les paramètres adéquats (palette...)
; Using this trick, the 8*11 spr[]-SCBs only need 11 Bytes each!
_init_scb:
dc.b $c1, $10, $20
dc.w _SCB ; PTR_NEXT pointe vers le 1° sprite visible (SCB[0])
dc.w dummy ; PTR_DATA pointe vers un sprite "inexistant"
dc.w 200, 200 ; x,y -> on affiche en dehors de l'écran
dc.w $100, $100 ; pas de zoom
dc.b $01, $23, $45, $67, $89, $ab, $cd, $ef
dummy: dc.b 0,0,0 ; le sprite "inexistant"
; spr0 sert de modèle au sprites du tableau SCB
_spr0: dc.b $c4, $08, $02 ; CTL0, CTL1 = réutilise la palette, COLL
dc.w 0, 0
dc.w 0, 0
#endasm
void init_sprites()
{
char i1;
for (i1 = 0; i1 < 25; i1++)
{
bcopy(&spr0[0], &SCB[i1][0], 11);
SCBX(&SCB[i1][0]) = 0;
SCBY(&SCB[i1][0]) = 0;
SCBNEXT(&SCB[i1][0]) = &SCB[i1+1][0];
}
SCBNEXT(&SCB[24][0]) = 0;
}
Le gros avantage d'utiliser une structure de 11 octets pour les sprites chainés, c'est de gagner 12 octets par sprite (ça peut gratter 1 ou 2ko au final, ce n'est pas rien), et également, c'est un peu plus rapide car le système sait que chaque sprite a les mêmes paramètres (zoom, tilt...).
Inconvénient, tu ne peux pas en zoomé un individuellement. Avantage, si tu zoomes le premier, tous le seront (ça peut être utile dans certaines circonstances)
Pour la suite, c'est facile, à un moment, tu appelles init_sprites pour initialiser ton tableau, ensuite, pour accéder individuellement à un sprite dans ton tableau :
SCBX(&SCB[ij][0]) = x;
SCBY(&SCB[ij][0]) = y;
// [...]
Un petit truc en passant, si tu ne veux plus afficher un sprite, tu peux soit le déplacer en dehors de l'espace écran, ou jouer sur SCBCTL1(]) pour le déclarer affichable ou non (il est initialisé à 8, mais si tu le mets à 12, ton sprite n'est plus affiché, ça accélère un peu le process).