Suivez-nous sur X

|
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z,
ALL
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
A propos d'Obligement
|
|
David Brunet
|
|
|
|
Programmation : Assembleur 68k - défilement avec déplacements de pointeurs
(Article écrit par François Fleuret et extrait de Génération 4 - mars 1989)
|
|
Consacrons-nous à la subtile programmation des défilements. Ceux-ci peuvent être réalisés de deux manières
différentes : la première fait le déplacement avec le Blitter. Cette technique souffre d'un gros défaut :
elle est lente, même avec un processeur spécialisé comme Agnus. La seconde est plus élégante et consiste
à déplacer les pointeurs vidéo dans la mémoire afin de donner une impression de mouvement. C'est ce que
nous allons voir aujourd'hui.
Comme vous pouvez le constater, le programme est court car il ne s'encombre pas des initialisations
multiples du Blitter.
Le programme gère cinq plans monochromes qui ont chacun une taille de 320x256 pixels. Chacun de ces
plans possède son propre pointeur vidéo ; le Copper place dans ces pointeurs l'adresse du premier
mot à lire au début de la VBL. Pour donner l'impression de rebond, on fait varier cette valeur en
fonction du temps, de plus, on modifie l'amplitude du rebond en fonction du numéro du plan pour
donner un effet de perspective. Pour cela, on divise la coordonnée du rebond par deux à chaque plan
que l'on traite (le premier a une amplitude de 128 points, le second de 64 points, le troisième de
32, etc.).
Le dernier détail un peu "particulier" de cette méthode est la palette de couleur. En effet, pour donner
une priorité à l'affichage (quel plan sera devant quel autre), on doit choisir une bonne palette.
Pour comprendre le principe du choix des couleurs, il faut savoir comment le coprocesseur vidéo détermine
la couleur d'un pixel à afficher. Pour chaque point, le coprocesseur prend un bit dans le plan 0, un
dans le plan 1, un dans le plan 2, etc. et constitue ainsi un groupe de cinq bits qui définit une
couleur parmi 32 (on trouve la valeur de cette couleur dans les 32 registres couleurs). On a donc ce
tableau (le premier chiffre donne la valeur en décimal de la couleur d'un point, le second cette même
valeur en binaire et il y a un petit commentaire sur la structure de la couleur) :
- 0 = 00000 Aucun plan n'a de point.
- 1 = 00001 Le plan 0 a un point.
- 2 = 00010 Le plan 1 a un point.
- 3 = 00011 Les plans 0 et 1 ont des points.
- 4 = 00100 Le plan 2 a un point.
- etc.
Donc, si on veut que le plan 0 soit devant le plan 1, il suffit de mettre la couleur du plan 0 dans
les registres couleur 1 et 3, et la couleur du plan 1 dans le registre 2. Dans le programme que je
vous donne aujourd'hui, les plans sont bleus avec un dégradé entre les plans éloignés et ceux rapprochés.
Le plan 4 (le cinquième) est le plus proche, il est plus clair et a une amplitude de rebond de 128 pixels),
évidemment, le plan 0 est le plus loin...
L'action se déroule ainsi : au début du programme, on fait les initialisations qui s'imposent (IRQ,
DMA, fenêtre d'affichage et couleurs) puis le programme est bloqué par un BRA car on ne fait l'animation
que pendant l'IRQ afin d'être parfaitement synchronisé avec le balayage. Pendant l'IRQ, on incrémente
un compteur de temps puis on calcule la position verticale des pointeurs sur les plans de bits avec
la formule : Y=(((T and 63)-32)^2)/8 (vous pouvez vérifier, ça fait bien "des paraboles périodiques").
Après, on multiplie cette position par 40 pour obtenir l'adresse où l'on va placer le pointeur de plan
de bits. On divise ensuite cette valeur par deux pour obtenir la position du pointeur du plan de bits
suivant.
Erratum : trois lignes ont disparu à la mise en page, sans cela, le programme ne peut pas fonctionner
(il manque le retour d'interruption). Après la ligne "MOVE.W #$10,$DFFO9C", il faut rajouter :
FIN_IRQ:
MOVE.L (SP)+,D0
RTE
|
C'est dans ces zones qu'il faut changer les cinq images monochromes non compactées et en 320x256. Pour cela,
il faut faire cinq RI [nom_image] [ImageX].
Ce défilement ne demande que quelques centaines de cycles à la machine à chaque VBL,
vous pouvez donc le faire fonctionner en même temps que la plupart des autres animations.
|