CODING ★ COURS DE GRAPHISME . ANIMATION DE SPRITES ★

Graphic - 15 - Animation de Sprites (SOS Programmeurs)
Autre astuce simple dérivant de la méthode précédente : On crée une table représentant un même objet représenté dans les 8 directions possibles et c'est la direction du déplacement qui choisit le sprite à afficher . On aura ainsi un mouvement très réaliste .

Dans le programme qui suit , 8 sprites sont contenus dans la table et stockés comme suit :

Numéro : 1 ;Direction représentée : Haut
Numéro : 2 ;Direction représentée : Diagonale haut droite
Numéro : 3 ;Direction représentée : Droite
Numéro : 4 ;Direction représentée : Diagonale bas droite
Numéro : 5 ;Direction représentée : bas
Numéro : 6 ;Direction représentée : Diagonale bas gauche
Numéro : 7 ;Direction représentée : Gauche
Numéro : 8 ;Direction représentée : Diagonale haut gauche


Une petite amélioration à été apportée au déplacement latéral ce qui a permis d'optimiser la routine d'affichage des sprites par rapport à la version SOS6 . C'est la présente version de AFFISP qui sera utilisée dans tous les exemples d'animation multi-sprites de ce numéro .

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

;
;- ANim3.MAX -
;
;- Changement de sprite selon la direction donnee par le joystick -
;- Utilise une table en mode 0 ou TOUS LES SPRITES SONT DE TAILLE IDENTIQUE -
;- Tous les parametres (LSP,HSP,Etc ...) Sont connus par le programme FIXETSG -
;
ORG 35000
JP DEBUT
NOLIST
;
Les définitions EQU et variables sont identiques au programme précédent
on y-ajoute juste ADPROV , OLDADV , DIRJOY pour les calculs de déplacement .
HSP EQU #1A09 ;Largeur & hauteur du sprite
HSP1 EQU #1908 ;Largeur-1 & hauteur-1 du sprite
HSP2 EQU #1A ;Hauteur du sprite
LSP EQU 9 ;Largeur du sprite
LSP1 EQU 8 ;Largeur-1 du sprite
TOTSP EQU 234 ;Nombre d'octets par sprite
NBSP EQU 8 ;Nombre de sprites
TABLSP EQU 40000 ;Adresse de chargement de la table
ADINK EQU NBSP*TOTSP+TABLSP+4 ;Formule qui donne la table des encres
PREMAFF EQU #C050 ;1ere adresse d'affichage
;
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
ADPROV DW 0 ;Adresse écran provisoire pour diagonale
OLDADV DW 0 ;Adresse écran avant deplacement
DIRJOY DB 0 ;Direction du joystick
ADR38 DB 0


Toujours comme programme précédent .

;
;- Initialiser -
;
DEBUT LD HL,ADINK ;Adresse des encres table de sprites .
XOR A
FIXINK INC A ;Initialiser les encres
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
;
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
;
MODI38 DI ;Annuler TOUTE interruption
LD A,(#38)
LD (ADR38),A
LD A,#C9
LD (#38),A
EI
;
LD HL,PREMAFF ;Adresse 1er affichage donnee par EQU
LD (VISAD),HL
CALL FINDSP ;Trouver le sprite voulu
CALL AFFISP ;1er affichage
;
Ici commence la boucle principale d'animation . Si SPACE est pressée on
quitte le programme .
;
TSTKEY DI ;Test direct de SPACE presse
LD BC,#F792
OUT (C),C
LD BC,#F645
OUT (C),C
LD B,#F4
IN A,(C) ;SPACE ? Oui si #7F
CP #7F
JR NZ,TSTJOY
;
LD A,(ADR38) ;Si SPACE presse restaurer interruptions
LD (#38),A ;et fini
EI
RET


Ici on teste le joystick par les ports E/S pour ne pas utiliser le vecteur #BB24 . La correspondance des bits avec FIRE et les 4 directions est la même que par #BB24 mais c'est un bit à 0 qui signale une opération active au lieu d'un bit mis ! Un XOR #FF (Voir le cours assembleur de SOS6 pour XOR) inverse tous les bits du résutat du test clavier . Ceci nous permet de rester 100% compatible avec les routines de déplacement décrites dans SOS6 .

;
;- Test direct du joystick -
;
TSTJOY LD BC,#F792
OUT (C),C
LD BC,#F649
OUT (C),C
LD B,#F4
IN A,(C) ;BIT 4=Fire , 3=Droite , 2=Gauche , 1=Bas , 0=haut
XOR #FF ;Contrairement a #BB24 , les bits concernes sont mis
AND %00011111 ;a 0 si la direction est active . XOR #FF inverse
JR Z,TSTKEY ;l'etat de ces bits ce qui permet de rester compatible
; ;avec les routines du trimestre dernier .
LD (DIRJOY),A ;Memoriser direction
LD HL,(VISAD) ;et adresse écran en cours .
LD (OLDADV),HL


Petit rappel de notre cours d'assembleur SOS5 , INC (IY+0) incrémente LE CONTENU DE L'OCTET POINTE PAR IY . Cela revient à faire :

LD A,(NUMSP) - INC A - LD (NUMSP),A

L'avantage notoire de ceci est de laisser libre le registre A qui doit rester inchangé pour la suite de comparaisons . Si vous prenez la peine de regarder la table des durées d'instructions (SOS6) vous verrez que si INC(IY+0) est assez prohibitif en durée , cela reste plus rapide que tout autre combinaison d'instructions préservant l'accumulateur à chaque comparaison .

;
;- Pointer le sprite voulu en fonction de la direction (de 1 a 8) -
;
LD IY,NUMSP ;Numero du sprite
LD (IY+0),1 ;mis a 1 pour le sprite representant le vaisseau
; ;en position verticale .
CP %0001 ;Si haut on garde
JR Z,GOSPR
INC (IY+0) ;Sinon on passe au suivant tant que la direction
; ;donnee n'est pas trouvee
CP %1001 ;Haut droite
JR Z,GOSPR
INC (IY+0)
;
CP %1000 ;Droite
JR Z,GOSPR
INC (IY+0)
;
CP %1010 ;Bas droite
JR Z,GOSPR
INC (IY+0)
;
CP %0010 ;Bas
JR Z,GOSPR
INC (IY+0)
;
CP %0110 ;Bas gauche
JR Z,GOSPR
INC (IY+0)
;
CP %0100 ;Gauche
JR Z,GOSPR
INC (IY+0)
;
CP %0101 ;Haut gauche
JR Z,GOSPR
INC (IY+0)
;
GOSPR PUSH AF ;Preserver direction
CALL FINDSP ;et pointer le sprite correspondant a cette
POP AF ;direction
;
;RRCA ;comme le trimestre precedent
PUSH AF
CALL C,ENHAUT
POP AF
;RRCA
PUSH AF
CALL C,ENBAS
POP AF
;RRCA
PUSH AF
CALL C,AGAUCH
POP AF
;RRCA
CALL C,ADROIT
;
CALL AFFISP
JP TSTKEY
;
;- En bas -
;
ENBAS LD B,4
LD HL,(COINBD)
;
B1 LD A,H
;SUB #FF
JR NZ,OKBAS
LD A,L
CP #80
RET NC
;
OKBAS CALL ADINF
DJNZ B1
LD (COINBD),HL
;
LD HL,(VISAD)
LD (ADPROV),HL
LD B,4
B2 CALL ADINF
DJNZ B2
LD (VISAD),HL
RET
;
;- Mouvement en haut -
;
ENHAUT LD HL,(VISAD)
LD B,4
;
H1 LD A,H
;SUB #C0
JR NZ,OKHAUT
LD A,L
CP #50
RET C
;
OKHAUT CALL ADSUP
DJNZ H1
LD (VISAD),HL
;
LD HL,(COINBD)
LD B,4
H2 CALL ADSUP
DJNZ H2
LD (COINBD),HL
;
LD BC,LSP1 ;Defini par EQU
AND A
;SBC HL,BC
CALL ADINF
LD (ADPROV),HL
RET
;
;- A DROITE -
;
STOPLAT LD A,(DIRJOY)
AND %00000011
LD (DIRJOY),A
RET
;
ADROIT LD HL,(COINBD)
CALL TSTLAT
CP #4F
JR Z,STOPLAT
;
INC HL
LD (COINBD),HL
LD HL,(VISAD)
LD (OLDADV),HL
INC HL
LD (VISAD),HL
RET
;
;- A gauche -
;
AGAUCH LD HL,(VISAD)
CALL TSTLAT
OR A
JR Z,STOPLAT
;
DEC HL
LD (VISAD),HL ;Petite modification par rapport a SOS6 .
LD BC,LSP ;Calcule OLDADV ici au lieu de s'en occupper
ADD HL,BC ;dans AFFISP
LD (OLDADV),HL
LD HL,(COINBD)
DEC HL
LD (COINBD),HL
RET
;
;- Tester hors écran -
;
TSTLAT PUSH HL
LD A,H
RESUB SUB 8
;BIT 6,A
JR NZ,RESUB
ADD A,8
;
LD H,A
AND A
LD DE,#50
RESUB1 SBC HL,DE
BIT 6,H
JR NZ,RESUB1
ADD HL,DE
LD A,L
POP HL
RET
;
;- Affichage sprite a l'ecran -
;
AFFISP LD BC,HSP ;Defini par EQU
LD DE,(VISAD)
LD HL,(ADSP)
LIST
CALL FRAME ;Sinon ca va beaucoup trop vite
NOLIST
;
BCLAFI PUSH DE
PUSH BC
LD B,0
LDIR
POP BC
LASUIT POP DE
LD A,D
ADD A,8
LD D,A
JR NC,EXITAF
PUSH HL
LD HL,#C050
ADD HL,DE
EX DE,HL
POP HL
EXITAF DJNZ BCLAFI
;
;- Afficher les lignes écran stockees pour recouvrir les traces de -
;- l'ancien affichage -
;
LD A,(DIRJOY)
AND %00000011
JR Z,TSTCOL
;
LD HL,(ADPROV)
LD BC,LSP1 ;Defini par EQU
;
AFLINE LD B,4
BCLINE PUSH HL
;
PUSH HL
POP DE
INC DE
LD (HL),0
PUSH BC
LD B,0
LDIR
;
POP BC
POP HL
;
LD A,H
ADD A,8
LD H,A
JR NC,F1
LD DE,#C050
ADD HL,DE
;
F1 DJNZ BCLINE
;
;- Colonnes -
;
TSTCOL LD A,(DIRJOY) ;Ici un seul test car OLDADV est calcule depuis
AND %00001100 ;les routines de deplacement ce qui permet de
JR Z,EXIT ;gagner quelques cycles d'horloge par rapport
;
LD HL,(OLDADV) ;a la version SOS6
LD A,HSP2 ;Defini par EQU
LD B,A
BCLCOL LD (HL),0
LD A,H
ADD A,8
LD H,A
JR NC,F2
LD DE,#C050
ADD HL,DE
F2 DJNZ BCLCOL
XOR A
EXIT LD (DIRJOY),A
RET
;
;- Calcul de l'octet au dessus et en dessous d'un octet écran -
;
ADINF LD A,H
ADD A,8
LD H,A
RET NC
PUSH DE
LD DE,#C050
ADD HL,DE
POP DE
RET
;
ADSUP LD A,H
;SUB 8
LD H,A
AND %01000000
RET NZ
PUSH DE
LD DE,#3FB0
ADD HL,DE
POP DE
RET
;
LIST
FRAME PUSH BC
NOLIST
LD B,245
ATTEND IN A,(C)
RRA
JR NC,ATTEND
POP BC
RET
;
;- Va chercher et range les paramtres du dessin NUMSP -
;
FINDSP LD A,(NUMSP) ;Numero demande
PUSH DE ;Preserver DE
LD HL,TABLSP+4 ;TABLSP+4 est l'adresse ou commence le 1er sprite
; ;Defini par EQU
LOOKSP DEC A
JR Z,ESTFIND
;
LD DE,TOTSP ;Nombre d'octets occupes par 1 sprite defini par EQU
ADD HL,DE ;Pointer le debut du suivant
JR LOOKSP
;
ESTFIND LD (ADSP),HL ;Ranger l'adresse trouvee
POP DE
;
FINDCOIN PUSH BC
LD BC,HSP1 ;LSP & HSP sont connus et invariables
; ;Defini par EQU
PUSH BC
LD B,0 ;On cherche COINBD
LD HL,(VISAD)
ADD HL,BC
POP BC
COIN CALL ADINF
DJNZ COIN
LD (COINBD),HL
POP BC
RET
;
LIST
ADR38 DB 0
;

Ceci est le dernier listing intégral concernant l'animation de sprites . La routine d'affichage AFFISP , les calculs d'adresses ADINF , ADSUP , la fonction FRAME et d'autres routines sont les mêmes pour tous les programmes .
Elles seront supprimées des listings source pour gagner un maximum de place sur cette face . Ainsi , dans ces sources , vous verrez toujours : CALL AFFISP (Ou autre routine usuelle) sans trouver la routine appelée . C'est normal . Si vous voulez reconstituer le source intégral pour votre assembleur , il vous suffit d'aller chercher les routines manquante dans le listing ci-dessus . Souvenez vous que les fichiers texte de SOS PROGRAMMEURS sont en ASCII 100% et compatibles avec PYRADEV , MAXAM , LASER GENIUS . Il vous suffit de charger le fichier texte correspondant dans votre assembleur et d'éliminer tout ce qui n'est pas la routine proprement dite . Pour DAMS , il vous faut hélas tout recopier manu militari !

Rendez vous au prochain chapitre pour l'animation multi-sprites .

SOS PROGRAMMEURS

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

Page précédente : Graphic - 14 - Animation des Sprites
★ AMSTRAD CPC ★ DOWNLOAD ★

Other platform tool:
» SOS7DEMODATE: 2011-06-03
DL: 1505
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 » Graphic - Scroll Demo (The Amstrad User)
» Coding Src's » Graphic - Linear Regression (Popular Computing Weekly)
» Coding Src's » Rasterprogrammierung in Assembler (CPC Amstrad International)
» Coding » Graphic - 40 - Overscan (SOS Programmeurs)
» Coding Src's » Elipses (Amstrad User)
» Coding Src's » Windmill (Popular Computing Weekly)
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 270 millisecondes et consultée 2009 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.