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 - Animation d'un sprite sous IRQ (2e partie)
(Article écrit par Dominique Genot et extrait d'Amiga News Tech - juillet 1990)
|
|
"Animer un sprite" signifie modifier régulièrement sa position à l'écran d'où un déplacement visible plus ou
moins rapide. Une première considération s'impose. Pour animer un sprite, il est inutile d'effacer l'ancien,
puisque les sprites sont redessinés à chaque balayage de l'écran par le faisceau d'électrons ("raster").
Cette propriété distingue les sprites des "bobs" animés au Blitter. Mais on peut en conclure aisément que le
changement de position ne saurait se faire n'importe quand. Il est impératif de modifier la position des
sprites avant le balayage de l'écran, pendant le "temps mort vertical" appelé "vertical blank". Pour réaliser
cela, on peut tester la position du faisceau d'électrons (avec les registres $DFF004 et $DFF006), mais le
plus astucieux est d'utiliser les routines interruptions du processeur. En effet, à chaque temps mort vertical,
le Copper envoie un signal d'interruption de niveau 3 dite IRQ3 (Interruption Request niveau 3), le
micro-processeur "sautera" alors la routine correspondante. Il ne s'agit pas de supprimer cette routine, mais
d'y ajouter une routine bien sentie...
Pour cela, on respectera l'ordre suivant :
- Interdire les interruptions avec move.w #$4000,$DFF09A ; INTENA.
- Mettre de côté l'adresse de la routine normale, adresse stockée en $6C avec move.l $6C,oldirq.
- Mettre à la place l'adresse de notre routine avec move.l newirq,$6C.
- Rétablir les interruptions avec move.l #$C000,$DFF09A.
Ce qui précède implique deux choses :
- Notre routine "newirq" doit se terminer en lançant la routine normale, ce qu'on réalise
en ajoutant à la fin :
- Dans la routine newirq, il faut préserver les registres au début et les restituer à
la fin avec :
movem.l d0-7/a0-7,-(sp)
.....(routine).....
movem.l (sp)+,d0-7/a0-7
|
...comme dans l'exemple.
Pour faire un travail propre, il faut restaurer l'interruption normale quand le programme rend la main :
move.w #$4000,$DFF09A ; supprime interruptions
move.l oldirq,$6C ; remet l'adresse normale
move.w #$C000,$DFF09A ; autorise interruptions
|
En résumé, on peut dire que la liste Copper sert à faire les dessins (champ de jeu ou sprites)
et que l'IRQ3 sert à faire l'animation.
Une dernière précision en ce qui concerne les registres DIWSTRT et DIWSTOP qui sont fixés dans la
liste Copper. La valeur de DIWSTRT conditionne celle de DDFSTRT (cycles du DMA-plan de bits) et il
faut que celle-ci soit supérieure à $38, sinon on risque de donner au DMA-plan de bits des cycles
normalement alloués au DMA-sprite, ce qui empêcherait le dessin de certains sprites. En conclusion, il
est préférable de fixer DIWSTRT plus grand que $81 en abscisse.
NEWIRQ
Que va-t-on mettre dans cette routine ? Le problème est simple : changer la position des sprites.
D'après l'article sur les structures de sprites,
il faut pour cela changer les valeurs des mots de contrôle figurant dans les structures. Comment
est déterminée la nouvelle position ?
- Ou bien les sprites se déplacent suivant une ligne droite et il suffit d'ajouter ou de retrancher une
certaine valeur aux coordonnées x et y.
- Ou bien les sprites se déplacent en suivant une courbe dont l'équation est programmée. Dans ce dernier cas,
la position des sprites peut être calculée en fonction d'un paramètre variable (angle, temps, etc.).
Les calculs sont faits avec les bibliothèques mathématiques pendant l'IRQ3 : c'est le cas du programme
proposé.
- Ou bien on a préparé une table de valeurs qui contient les futures coordonnées et on va "pêcher"
dans cette table.
Il est donc difficile de donner un modèle pour la routine "newirq" puisqu'elle dépend de la courbe choisie pour
le déplacement des sprites. Dans tous les cas, on retrouvera l'ordre suivant :
- Préservation des registres.
- Détermination des nouvelles positions.
- Modification des mots de contrôle dans les structures : on peut utiliser la routine "placem_sprite" du mois précédent.
- Récupération des registres.
- Lancement de l'IRQ3 normale (comme indiqué plus haut).
Précisons tout de même certains points...
Placements des sprites
Il est nécessaire de les espacer (dans l'exemple choisi), ce qui est réalisé avec la table "index".
Elle contient les valeurs 0,8,16,24,32. La première valeur est utilisée pour le premier sprite, la
deuxième valeur est utilisée pour le deuxième sprite, etc.
La valeur 8 signifie que l'on va retrancher 8 fois le pas à l'angle courant pour calculer la position
du deuxième sprite, ce qui le retarde ou l'éloigne davantage du premier (même principe pour les autres sprites).
Du coup, si l'on veut rapprocher les sprites, on peut essayer 0,4,8,12,16 dans la table "index". Attention cependant :
des valeurs impaires amèneront un Guru (adresse impaire) dans la routine "newirq" !
Pour éviter de recalculer à chaque interruption toutes les valeurs de cette table, toutes les valeurs sont décalées
d'un cran dans la table, puis la première valeur de la table est calculée et l'angle est incrémenté. En toute
logique, il faudrait alors tester si la courbe a été entièrement décrite, ce qui oblige à calculer sa période (ici : 2 Pi).
Comme dans le cas général le pas est très faible, on peut incrémenter l'angle sans test.
Vitesse de défilement
En ce qui concerne la vitesse de déplacement des sprites : elle est réglable en modifiant le pas de l'angle (fixé
à 0.025 radians dans l'exemple).
Courbe suivie par les sprites
En ce qui concerne la courbe de Lissajous utilisée dans l'exemple : on peut bien sûr programmer d'autres équations
dans la routine "calcul". Signalons quelques exemples d'équations amusantes...
En coordonnées polaires :
Rappel : la constante Pi peut être obtenue par arc_cos(-1) avec la routine SPAcos de la mathtrans.library
(voir l'article sur les bibliothèques mathématiques).
En coordonnées paramétrées :
Les couleurs
Il est possible de changer les couleurs des sprites en cours de défilement. Il suffit pour cela
de modifier les couleurs fixées dans la liste Copper :
color 17 à 19 ; color 21 à 23 ; etc.
|
Cette modification doit, une fois de plus, être faite pendant l'IRQ3. Il faut repérer dans la
liste Copper l'adresse du mot qui fixe la couleur en question et modifier le contenu de cette adresse.
Exemple :
dc.w color19,$00F ; coul 19 = bleu, dans la liste Copper
|
...sera remplacé par :
dc.w color19 ; coul 19
repere : ; fournit l'adresse en question
dc.w $00F ; = bleu
|
...et dans la routine "newirq", on ajoute :
move.w repere,D0 ; ancienne couleur
sub.w #1,d0 ; calcule nouvelle couleur : $00E,$00D,$00C...
; donc des bleus de nuances différentes
move.w D0,repere ; modifie la liste Copper
|
Cette sympathique option permet de faire des effets de couleurs en plus du défilement,
aussi bien pour les sprites que pour le fond (color 0).
Dessins supplémentaires
En ce qui concerne enfin le plan de bits qui n'est pas utilisé ici : il est possible d'ajouter un
décor au dessin en transférant quelques octets dans la zone mémoire dont l'adresse figure dans
"bplanel" si l'on a ajouté dans la liste Copper :
dc.wcolor1,$FFF ; move.w #$FFF,$DFF182
|
...pour fixer la couleur 1 en blanc par exemple. Voir à ce sujet la suite d'articles sur
le Blitter et les défilement que l'on peut en tirer.
Exemple :
Quelques explications au programme source qui suit. L'ordre des opérations se réduit à ceci :
- Ouverture des bibliothèques avec test de réussite.
- Réservation de mémoire Chip pour le plan de bits avec test de réussite.
- Préparation de la liste Copper en mémoire Chip.
- Détournement de l'IRQ3 : fournit la routine d'animation.
- Activation de la nouvelle liste Copper.
- Lancement du DMA et attente du bouton gauche de la souris.
- Restauration du système : DMA, liste Copper, IRQ3.
- Libération de la mémoire.
- Fermeture des bibliothèques.
Voilà ! Vous pouvez maintenant définir vos propres sprites, les animer, bidouiller les
couleurs pour faire des dégradés...
Attention : ce programme nécessite la présence de la mathtrans.library
dans le répertoire Libs: de votre disquette système.
|