CODING ★ COURS DE GRAPHISME , ANIMATION DES SPRITES ★

Graphic - 14 - Animation des Sprites (SOS Programmeurs)

Espérons que vous avez bien profité des cours du trimestre dernier . Ce trimestre nous ne revenons pas sur les principes d'affichage exposés précédement .

Le cours de ce trimestre est axé sur la gestion des sprites lors de leur animation et aux tests nécéssaires pour détecter une rencontre entre un sprite et quelque chose d'autre . Vous allez avoir l'occasion de constater que bien qu'assez simples , les routines nécéssaires demandent un code source très long . Pour ne pas les allonger d'avantage , nous avons retenu le mode
d'animation le plus simple (sur fond uniforme) proposé dans le dernier chapitre graphisme de SOS6 .

Commençons ce nouveau cours paisiblement avec quelque chose de très simple :

L'ANIMATION PAR SUPERPOSITION

Ceci à été effleuré dans le mode d'emploi du générateur de sprites de SOS6 . Cela consiste à donner l'illusion d'un mouvement en affichant successivement plusieurs images représentant un même objet ou personnage dans des positions différentes . Pour créer une animation de ce genre avec notre générateur de sprites , il faut d'abord déterminer laquelle de ces images occupera la plus grande surface . Ceci fait , on utilisera cette donnée comme taille de grille constante et on répondra toujours 'O' lorsque le programme demande 'Grille entière (O/N)' . Comme toujours , un dessin vaut mieux qu'un long discours , alors voici :

+-------------+ ; +-------------+
! *** ! ; ! *** !
! *** ! ; ! *** !
! * ! ; ! * !
! ***** ! ; !*************!
! * * * ! ; ! * !
! * * * ! ; !* * *!
! *** ! ; !*************!
! * * ! ; ! ;!
! * * ! ; ! ;!
! ** ** ! ; ! ;!
+-------------+ ; +-------------+

Ceci est correct car la seconde image recouvrira parfaitement la seconde et réciproquement .

+-------+ ; +-------------+
! *** ! ; ! *** !
! *** ! ; ! *** !
! * ! ; ! * !
! ***** ! ; !*************!
!* * *! ; ! * !
!* * *! ; !* * *!
! *** ! ; !*************!
! * * ! ; +-------------+
! * * !
! ** ** !
+-------+

Là vous avez oublié la sauvegarde en grille entière et c'est désastreux car le recouvrement des 2 images sera incomplet .

+-------------+ ; +-------------+
! *** ! ; ! *** !
! *** ! ; ! *** !
! * ;! ; ! * !
! ***** ! ; !*************!
!* * * ! ; ! * !
!* * * ! ; !* * *!
! *** ! ; !*************!
! * * ! ; ! ;!
! * * ! ; ! ;!
! ** ** ! ; ! ;!
+-------------+ ; +-------------+

Et ici cela ne vaut guère mieux car la première image est décentrée et le personnage semblera sauter de gauche à droite .


Pour vérifier la bonne tenue d'une suite d'image , il suffit d'utiliser l'option 5 du générateur et de lire la notice dans SOS6 .

-------------------

Comme tous les sprites sont de même taille , la table utilisée dans notre exemple à été fixée par 'FIXETSG' (Pardon pour les bogues de SOS6) .
Rappelons que FIXETSG élimine toutes les références d'adresses de sprites dans une table ou tous les dessins sont de taille identique . Il ne reste plus que :

OCTET 1 , Mode d'écran prévu pour les sprites .
OCTET 2 , Nombre de sprites dans la table .
OCTET 3 , Largeur commune a tous les sprites .
OCTET 4 , Hauteur commune a tous les sprites .

N'oubliez pas de noter tous les paramètres donnés par le programme FIXETSG , ils vous sont indispensables pour gérer la table ainsi créée .

--------------------

La pseudo directive 'EQU' étant présente sur tous les programmes assembleurs nous en profitons pour vous en rappeler l'usage :

ORG 40000
HSP EQU #200A
;
LD BC,HSP
RET
;

La ligne HSP EQU #200A a pour effet d'affecter la valeur #200A au label HSP . Ceci est interne au programme assembleur et sans effet sur le code généré . Par la suite , LD BC,HSP , affectera la valeur #200A au registre 16 bits BC . Attention : La plupart des assembleurs refusent de définir une seconde fois une même variable ! En principe , la directive EQU peut
apparaître n'importe où dans un code source . Son principal avantage est de pouvoir modifier très rapidement une constante dans un programme en cours de mise au point . Il suffit de changer la valeur qui suit EQU et de réassembler le programme .

Voici maintenant le programme en question utilisant d'abondance cette directive . Le principe est des plus simple : 'enchaînement des images est conditionnée par la table SEQET . Elle contient le numéro des sprites à afficher successivement . Tous les numéros sont répétés à plusieurs reprises pour maintenir plus ou moins longtemps à l'écran une image donnée . Cela permet une animation plus fine , d'autre part , une simple séquence comme : 1,2,3,2,4,1,4,#FF provoquerait un affichage si rapide qu'il en deviendrait indistinct .

Autre point important : Tous les programmes de ce numéro sont optimisés en durée . Contrairement à ceux de SOS6 , aucune routine système n'intervient au cours de leur déroulement sauf lors de l'initialisation ; on peut donc bloquer les interruptions en permanence à une condition : Attendre un peu dans une boucle que l'initialisation soit terminée ! Un blocage immédiat des interruptions en sortie d'initialisation aurait pour effet de bloquer au vol l'affectation des encres par le système qui se fait sous interruption et à besoin de quelques centièmes de secondes pour se terminer .

Pour bloquer les interruptions , il suffit simplement de mettre un code RET (#C9) dans la case mémoire déterminant le saut (#38) aux routines d'interruption . Il faut bien sur interdire provisoirement l'interruption par DI car si cette modification se produit au moment précis ou le Z80 déclenche son cycle (Tous les 1/300s.) , il ne reste plus qu'a déclarer le plan ORSEC en éteignant le CPC !

L'usage des vecteurs étant interdit , il faut tester le clavier directement par les ports E/S . Ceci à fait l'objet d'un cours complet dans SOS3 (1989) qu'il serait hors de propos de répéter ici .

-----------------------------

;
;- ANIM1.MAX -
;
;- Astuces pour affichage et animation de sprites -
;- 1 / Animation par supperposition -
;- Utilise une table en mode 0 ou TOUS LES SPRITES SONT DE TAILLE IDENTIQUE -
;- Tous les parametres (LSP,HSP,Etc.) Sont donnes par le programme FIXETSG -
;
ORG 35000
JP DEBUT
;

On commence par définir les variables déterminant hauteur et largeur des sprites a employer . On constate qu'avec 'EQU' il faut considérer séparément les valeurs 16 bits et les 8 bits . HSP EQU #1105 suivi de LD A,HSP sera refusé par l'assembleur .

HSP EQU #1105 ;Hauteur & largeur du sprite
HSP1 EQU #1004 ;Hauteur-1 & largeur-1 du sprite
HSP2 EQU #11 ;Hauteur du sprite (En lignes)
LSP EQU 5 ;Largeur du sprite (En cases écran)
LSP1 EQU 4 ;Largeur-1 du sprite
TOTSP EQU 85 ;Nombre d'octets ocupes par un sprite
NBSP EQU 12 ;Nombre de sprites
TABLSP EQU 40000 ;Adresse de chargement de la table

EQU Admet souvent des formules complexes incluant des valeurs déja définies par cette même directive . La formule ci-dessous revient à dire :

ADINK=12 (Le nombre de sprites dans la table)
*85 (La longueur d'une zone de données sprite)
+40000 (L'adresse de location de la table)
;+4 (Les 4 octets d'entête de la table)
ADINK EQU NBSP*TOTSP+TABLSP+4 ;Formule qui donne la table des encres
PREMAFF EQU #C050 ;1ere adresse d'affichage
;

Les constantes étant définies , on passe aux variables utilisées que vous devez connaître car elles ont le même nom et la même signification que dans les programmes du trimestre précédent .

NUMSP DB 1 ;Numero du sprite choisi
ADSP DW 0 ;Adresse du sprite choisi
VISAD DW 0 ;Adresse d'affichage du sprite choisi
COINBD DW 0 ;Coin oppose en bas a droite du sprite choisi
;
ADSEQET DW 0
SEQET DB 1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,3,3,2,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4
DB 1,1,1,1,1,1,4,4,4,4,4,4,4,4,4,4,#FF
;
;
;- Va chercher et range les paramtres du dessin NUMSP -
;- A Doit contenir le numéro du sprite demande -
;

La routine de recherche d'un sprite dans une table 'fixée' est plussimple et plus rapide que dans une table de sprites de taille variée . Nous n'avons plus besoin de rechercher les adresses pour chacun des sprites . En entrée , A doit contenir le numéro du sprite à trouver .

FINDSP PUSH DE ;Preserver DE
LD HL,TABLSP+4 ;C'est l'adresse ou commence le 1er sprite
LOOKSP DEC A
JR Z,ESTFIND
;
LD DE,TOTSP ;Nombre d'octets occupes par un sprite
ADD HL,DE ;Pointer le debut du suivant
JR LOOKSP ;Continuer
;
ESTFIND LD (ADSP),HL ;Ranger l'adresse ou commence le sprite
POP DE
;
FINDCOIN PUSH BC ;Trouver le coin inferieur droit pour l'affichage
LD BC,HSP1 ;LSP & HSP sont connus et invariables
;
PUSH BC
LD B,0 ;On cherche COINBD comme dans SOS6
LD HL,(VISAD)
ADD HL,BC
POP BC
COIN CALL ADINF
DJNZ COIN
LD (COINBD),HL ;On a trouve COINBD et on s'en moque car ce programme
POP BC ;ne l'utilise pas !
RET

Le programme proprement dit commence ici .

;
;- Initialiser -
;
DEBUT LD HL,ADINK ;Adresse des encres table de sprites donnee par EQU
XOR A
FIXINK INC A ;Initialiser les encres comme dans SOS6
LD B,(HL)
LD C,(HL)
;BIT 7,B
JR NZ,FININK
PUSH AF
PUSH HL
CALL #BC32
POP HL
INC HL
POP AF
JR FIXINK
;
;- Premier affichage -
;
FININK LD BC,#4000 ;Attendre un peu avant de bloquer les interruptions
WAIT DEC BC ;pour finir l'affectation des encres
LD A,B
OR C
JR NZ,WAIT
;
DI
LD A,(#38) ;Sauver le contenu d'origine de la case #38
LD (ADR38),A
LD A,#C9 ;Annuler TOUTE interruption
LD (#38),A
EI
;
LD HL,PREMAFF ;Adresse 1er affichage donnee par EQU
LD (VISAD),HL
;
REPOINT LD IX,SEQET ;Adresse de la sequence animation
RECOM LD A,(IX+0) ;Prendre le numéro demande dans la table des numéros
CP #FF ;Si #FF c'est la fin de la table on repart au debut
JR Z,REPOINT
;
LD (NUMSP),A ;Ranger le numéro a afficher
INC IX ;Avancer dans la table des sequences
CALL FINDSP ;Aller chercher le sprite
CALL AFFISP ;1er affichage
;
LD BC,#F792 ;Teste si SPACE est presse
OUT (C),C ;Version simplifiee des routines publiees
LD BC,#F645 ;dans SOS3 (1989)
OUT (C),C
LD B,#F4
IN A,(C) ;SPACE ? Oui si #7F
CP #7F
JR NZ,RECOM
;
RECU38 DI ;Si SPACE presse , fini mais on n'oublie pas de
LD A,(ADR38) ;remettre les interruptions en place sinon ...
LD (#38),A
EI
RET
;
Les routines AFFISP & ADINF sont identiques à celles présentées dans le
dernier chapitre graphisme de SOS6 .
;
LIST
ADR38 DB 0
;

Il ne vous reste plus qu'à voir les effets de ce petit programme par l'option démonstration et passer au chapitre suivant .

SOS PROGRAMMEURS

★ ANNÉE: ???
★ AUTEUR: MICHEL MAIGROT

Page précédente : Graphic - 13 - Fond Uniforme
★ AMSTRAD CPC ★ DOWNLOAD ★

Other platform tool:
» SOS7DEMODATE: 2011-06-03
DL: 1512
TYPE: ZIP
SiZE: 8Ko
NOTE: 40 Cyls
.HFE: Χ

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Coding Src's » OCP .WIN load
» Coding Src's » Graphic - Planets (Your Computer)
» Coding Src's » Graphic - Schneelandschaft (CPC Amstrad International)
» Coding Src's » Test CRTC v2.3 (MADRAM, amslive n19)
» Coding Src's » Poussiere (CPC Infos)
» Coding Src's » Self-Destruct (Amstrad Action)
Je participe au site:
» Vous avez des infos personnel, des fichiers que nous ne possédons pas concernent ce programme ?
» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop/c
Page créée en 757 millisecondes et consultée 2126 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.