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 : AMOS - Déformations sinusoïdales
(Article écrit par Daisy Lionet et extrait d'Amiga News Tech - décembre 1991)
|
|
"Petite démo" ? Comment ça, "petite démo" ? Le programme que j'ai tapé de mes pattes poilues
va révolutionner le monde de l'Amiga... C'est tout simplement du concentré de génie. Non mais !
Tiens, comme je suis bonne patte, je vais essayer de vous en expliquer le fonctionnement...
Vous connaissez les déformations sinusoïdales ? En voici une toute simple à réaliser,
sur plus de 200 lignes d'écran et au 1/50e de seconde, s'il vous plaît ! Elle est de
plus totalement paramétrable. J'explique.
Il n'est même pas envisageable de calculer une déformation sinusoïdale en temps réel, au
1/50e sur 200 lignes : c'est déjà très difficile en langage machine, donc impossible en AMOS.
Il faut donc ruser et calculer tout à l'avance : les images étant déjà dessinées, il
suffira de les faire défiler à l'écran l'une après l'autre. Bon.
La première idée qui vient à l'esprit est d'ouvrir plusieurs écrans et de les faire défiler
avec l'instruction SCREEN TO FRONT. Ce n'est pas mal, mais nous somme limités à huit
images au maximum, trop peu pour une bonne animation. Même en passant les écrans en double
tampon mémoire, on reste encore limités à 16 images, encore trop peu, surtout si l'on veut
faire défiler un texte par-dessus.
Mon idée de génie, je dois le dire, a été de réserver une banque de mémoire Chip, contenant
la place nécessaire à toutes les images précalculées. Par exemple, pour 20 pas d'animation
d'une image de 320x200 en 2 couleurs, la taille de cette banque est de 160 ko.
Comment afficher le contenu de cette banque dans un écran ? Mon deuxième coup de génie, je
dois l'avouer modestement, est d'utiliser l'instruction SCREEN OFFSET. Car avez-vous
remarqué que cette instruction permet d'explorer toute la mémoire graphique de l'Amiga,
simplement en utilisant de grandes valeurs en Y ? En calculant la distance entre la
grosse banque de mémoire et l'écran numéro 0, on peut connaître les valeurs à utiliser
dans l'instruction et afficher tout simplement le contenu de la banque au lieu de l'image normale.
Voilà pour la théorie, voyons le programme. On commence par récupérer le maximum de mémoire
possible, en fermant les écrans et l'éditeur. On définit ensuite les valeurs de la déformation :
- NPAS est le nombre d'images calculées. Plus NPAS est grand, plus lente est la déformation.
Essayez donc 20 ou 30 pour commencer.
- AMPX1# et AMPY1# définissent la déformation en X.
- AMPX2# et AMPY2# définissent la déformation en Y.
Modifiez ces valeurs et voyez le résultat.
Le programme réserve alors la grosse banque de mémoire Chip puis ouvre l'écran 0. Il faut s'assurer que
l'adresse de l'écran 0 est inférieure à celle de la banque, car SCREEN OFFSET n'accepte pas de valeurs
négatives. On ouvre maintenant deux écrans de travail, que l'on cache le temps de calculer toutes les
déformations. Celle en X est d'abord appliquée entre l'écran 0 et l'écran 1, puis celle en Y, de l'écran
1 dans l'écran 2. On peut alors utiliser l'instruction COPY pour copier le contenu de la bitmap dans
la banque de mémoire, en bonne position. Reste à calculer la "distance" entre l'écran 0 et la première
image de la banque, et c'est tout.
C'est AMAL qui se charge de l'animation. Les registres à initialiser sont RA (valeur de base en X), RB
(valeur de base en Y), RC (nombre de lignes d'une image) et RD (nombre de pas d'animation). La chaîne AMAL
se contente de modifier les valeurs de SCREEN OFFSET en X et en Y. C'est tout.
Une fois la chaîne initialisée, on peut retourner en mode direct : l'animation marche toute seule !
Vous pourrez animer d'autres images en utilisant la même méthode. L'écran 0 peut faire partie d'un double champ de jeu
(Dual Playfield) et dans ce cas, vous pourrez faire bouger un gros logo devant.
|