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 "The Big"
(Article écrit par François Fleuret et extrait de Génération 4 - mai 1989)
|
|
Pour continuer notre grande série "The scrollings are better on Amiga"
(articles 1,
2 et
3)
nous allons programmer dans cet article un déplacement sur écran géant tel que celui de la démo
de "The Young Ones". Bien que cet effet paraisse étonnant vu de l'extérieur, sa réalisation est
fort simple car le merveilleux processeur vidéo de l'Amiga permet de gérer un plan ("playfield")
plus grand que la partie visible sur l'écran.
Dans notre programme, nous allons afficher une petite image de 320x256 points (que nous appellerons
la fenêtre) qui sera en réalité une portion d'une grande image de 640x512 points. Cette image sera
monochrome pour simplifier le programme bien qu'il soit fort simple de gérer une image de plusieurs
plans de bits avec la même méthode. Pour réaliser cet "affichage partiel", on utilise le modulo des
plans, registre magique qui permet de définir des lignes plus larges que celles visibles à l'écran.
Le principe du modulo consiste à rajouter une valeur au pointeur du plan de bits lorsqu'il arrive en
fin de ligne pour "sauter" une portion d'image. Dans notre cas, l'image affichée a 320 points sur
chaque ligne et l'image en mémoire en a 640, il faut donc passer 320 points par ligne, d'où un modulo
de 40 octets (40x8=320 points). C'est simple, non ?
De plus, pour faire déplacer notre fenêtre sur l'image, on fait varier la valeur de départ du pointeur
au début de la VBL. On calcule cette adresse avec CX et CY qui sont les coordonnées horizontale et verticale
de la fenêtre sur la grande image. Malheureusement, le pointeur du plan de bits ne permet pas d'avoir une
précision horizontale supérieure à 16 points. Il faut donc, pour avoir un mouvement fluide, utiliser le
registre de décalage des plans (BPLCON1 $DFF102). Mais ce décalage est visible sur le bord gauche de
l'image, il faut donc cacher les 16 points à gauche. Pour cela, on rétrécie l'image horizontalement en
modifiant la taille de la fenêtre sans changer DDFSTRT et DDFSTOP.
Afin de compliquer un peu ce programme (qui serait trop simple, avouons-le), il y a en plus une liste
Copper qui suit le déplacement pour afficher un dégradé qui bouge avec la coordonnée CY. Pour faire
cela, on construit une grosse liste Copper au début dont on modifie les "MOVE" à chaque VBL (comme pour
les barres qui rebondissent). Les "WAIT" se font à l'abscisse $E1 pour qu'il n'y ait pas de problème
à la ligne 255. Car lorsque le WAIT se produit à cette abscisse, la durée du MOVE qui est après fait
passer le balayage à la ligne suivante, donc, dans le cas de la ligne 255, à la ligne 0 de la deuxième
partie de l'écran. Donc, quand le Copper lira le WAIT suivant (celui de la ligne 0 de la deuxième partie
de l'écran), il ne croira pas qu'il a déjà passé cette position. Si vous voulez mieux comprendre, essayez
donc de faire des listes Copper qui fonctionnent bien à la ligne 255 et vous verrez le problème...
Pour ce qui est de la trajectoire de la fenêtre sur l'image, on fait un rebond vertical avec une
accélération vers le bas et un déplacement uniforme horizontalement (sans accélération) mais avec
également un rebond sur les bords.
L'image doit être placée dans le code objet avec un RI [ret] nom_image.iff [ret] IMAGE [ret] [ret].
Elle doit être décompactée monochrome et avoir une taille de 640x512 points.
Et voilà, vous savez maintenant comment on fait des grands-écrans sur Amiga, cette possibilité
n'a pas de défaut majeur et permet beaucoup (mais alors beaucoup) de choses tout en ne prenant
que très peu de temps dans la VBL. De plus, vous pouvez sans problème rajouter un défilement
fait avec le Blitter dans la grande image. A vos claviers...
|