CODING ★ DEPLACEMENT DE SPRITE PIXEL PAR PIXEL SUR 3 PLANS EN MODE 0 ★

Graphic - 10 - Deplacement de Sprite Pixel Par Pixel sur 3 Plans en Mode 0 (SOS Programmeurs)

Par ci par la , vous verrez un commentaire IMP suivi d'un numéro , cela signifie que cette partie du listing est spécifique à un déplacement par pixels .

» SOURCE ASSEMBLEUR/Z80

REMARQUES SUR LE PROGRAMME D'ANIMATION PIXEL PAR PIXEL

L'essentiel porte sur la structure du programme , on remarque en effet que tous les paramètres sont calculés à partir de variables . Ceci a l'avantage de rendre ce programme compatible avec tous les usages possibles mais ralentit son exécution ! Bref , en tant que démonstration et programme de test pour visualiser l'effet d'un déplacement sur un fond et un plan donné c'est idéal mais inutilisable pour un programme de jeu .

Ce que l'on peut faire pour accélérer le programme :

1 Supprimer STEPX et STEPY et définir l'incrément de déplacement une bonne fois pour toute . Ceci permet de :
a : Economiser un peu de temps dans le chargement des registres .
b : Restructurer les boucles de ENHAUT , ENBAS , ADROIT , AGAUCH qui doivent tenir compte de toutes les positions possibles dans la version présentée .
c : La mise en constantes de STEPX , STEPY permet aussi de supprimer quelques calculs et LDIR - LDDR dans les transferts .
d : Dans le même esprit , LINEMOV et COLOMOV peuvent être supprimés puisque le nombre de déplacements devient invariable .

Ceci n'est qu'un début ! En mode 0 , un déplacement pixel par pixel correspond à ½ case mémoire . Réécrivons le tout pour un déplacement case par case ! L'animation est sera tout aussi fluide , le mouvement 2 fois plus rapide et le programme plus court . Difficile à faire ? Surement pas , les listings qui suivent vous montreront comment faire . Mais avant de les aborder voyons ce qui peut encore freiner l'exécution du programme .

2 : Le test JOYSTYCK &BB24 et la série des CALL #BB1E ! Les routines système c'est pratique mais c'est lent ! On dirait un troupeau d'escargots en train de pousser une brouette de machefer ! Si vous vous sentez de taille , remplacez les par un test direct des lignes claviers comme nous l'avons montré dans SOS3 .

3 : La couleur du fond : Là , c'est plus épineux , si l'on veut une image colorée on n'a pas le choix , mais si tout le fond est uni (SPACE INVADER) ou que le sprite se déplace dans des couloirs uniformes , plus besoin de calculs complexes pour composer un nouveau sprite on peut supprimer les routines de composition et renvoyer une suite de 0 pour effacer les traces du sprite ce qui du même coup supprime tous les calculs se rapportant à la table écran puisqu'elle n'est plus nécéssaire . Dans ce cas , le dessin semble passer d'un bord à l'autre de l'écran sans transition !

Il y-a bien d'autres astuces dont nous reparlerons ....

Maintenant nous vous représentons le même programme mais avec des constantes en place de STEPX , STEPY et en mode case par case . Rassurez vous , plus de la moitié du programme ne change pas . Nous ne montrons que les sections qui doivent être changées .

Quelques variables ont disparu , STEPX - STEPY - LINEMOV - COLOMOV et MASK qui ne sert qu'en mode pixel par pixel .

;
XPOS DW 304 ;35003-04
YPOS DW 200 ;35005-06
NUMSP DB 1 ;35007
LSP DB 0 ;35008
HSP DB 0 ;35009
ADSP DW 0 ;35010-11
VISAD DW 0 ;35012-13
COINBD DW 0 ;35014-15
LONGLTA DW 0 ;35016-17
LTABL DW 0 ;35018-19
FINTAB DW 0 ;35020-21
LTRTAB DW 0 ;35022-23
ADPROV DW 0 ;35024-25
FLAGAF DB 0 ;35026
OLDADV DW 0 ;35027-28
DIRJOY DB 0 ;35029
;

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

La disparition de LINEMOV et COLOMOV va nous géner car c'est par ces
variables que l'on faisait le test de position de la ligne et colonne à
restituer après affichage . Pour y suppléer , on mémorise la direction donnée
par le joystick lors du test . Juste une ligne et une variable à ajouter .

;
NOFIRE LD (DIRJOY),A ;Memoriser position joystick
LD HL,(VISAD)
LD (OLDADV),HL
;RRCA
PUSH AF
;............

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

Le gros morceau est bien modifié , dans les tests en haut et en bas on ne teste plus la validité du mouvement ligne à ligne mais par paquets de 4 . On se déplace en effet de 4 lignes d'un coup pour conserver un rapport de 45 degrés en diagonnale . Cela à un petit inconvénient : La position d'origine du 1er affichage doit se faire sur une ligne multiple de 4 sinon le dessin n'ira jamais jusqu'aux limites verticales de l'écran .

Dans les déplacements latéraux , on se ne déplace que d'une case , donc , plus de DJNZ et plus grand chose d'autre d'ailleurs . En revanche , on annulera les bits de mouvement latéral si le mouvment est impossible pour ne pas avoir un mauvais affichage en butée horizontale .

Observez une certaine simplification dans les routines qui vous donnent des maux de tête ... Tous les commentaires ne concernant pas les modifications effectuées ont été supprimés .

;
;- Routines de calcul pour les 4 deplacements possibles du sprite -
;
;- En bas - ***
;
ENBAS LD B,4 ;4 lignes d'office
LD HL,(COINBD)
;
B1 LD A,H ;Voir si on peut bouger de 4 d'un coup
;SUB #FF
JR NZ,OKBAS
LD A,L
CP #80
RET NC ;Non
;
OKBAS CALL ADINF ;On bouge
DJNZ B1
LD (COINBD),HL
;
LD HL,(VISAD)
LD B,4
B2 CALL ADINF
DJNZ B2
LD (VISAD),HL
;
STOPB CALL PARAVE
;
;- Transferer dans un buffer les lignes superieures de la table qui seront -
;- a renvoyer dans l'ecran lors du prochain affichage -
;
LD HL,TABLE
LD DE,LINES
PUSH BC
LDIR
POP BC
;
;- Remonter la table de sauvegarde écran de nb.lignes sur elle meme -
;
LD DE,TABLE
LD HL,TABLE
ADD HL,BC
LD BC,(LTRTAB)
LDIR
;
;- Passer lignes écran a recouvrir en fin de table -
;
LD HL,(COINBD)
LD DE,(FINTAB)
LD BC,(LONGLTA)
LD B,4 ;Nombre lignes 4 d'office
SLBAS PUSH HL
PUSH BC
LD B,0
LDDR
POP BC
POP HL
CALL ADSUP
DJNZ SLBAS
;
LD HL,(OLDADV)
LD (ADPROV),HL
RET
;
;- Mouvement en haut -
;
ENHAUT LD HL,(VISAD) ;Comme en bas , 4 lignes d'office
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
CALL PARAVE
;
;- Transferer dans un buffer les lignes inferieures de la table qui seront -
;- a renvoyer dans l'ecran lors du prochain affichage -
;
LD DE,LINES
LD HL,TABLE
PUSH BC
LD BC,(LTRTAB)
ADD HL,BC
POP BC
PUSH BC
PUSH HL
LDIR
POP HL
POP BC
;
;- Descendre la table de sauvegarde écran de nb.lignes sur elle meme -
;
LD HL,(FINTAB)
LD E,L
LD D,H
AND A
;SBC HL,BC
LD BC,(LTRTAB)
LDDR
;
;- Passer lignes écran a recouvrir en debut de table -
;
LD HL,(VISAD)
LD DE,TABLE
LD BC,(LONGLTA)
LD B,4 ;4 lignes d'office
BCLTH PUSH HL
PUSH BC
LD B,0
LDIR
POP BC
POP HL
CALL ADINF
DJNZ BCLTH
;
LD HL,(COINBD)
INC HL
LD BC,(LONGLTA)
AND A
;SBC HL,BC
CALL ADINF
LD (ADPROV),HL
RET
;
;- Calcul des longueurs de transfert pour deplacements verticaux -
;
PARAVE LD HL,0
LD BC,(LONGLTA)
;
;SLA B ;BC=Longueur d'une ligne * 4
;RL C ;Soit BC=BC*4
;SLA B
;RL C
;
LD HL,(LTABL)
AND A
;SBC HL,BC
LD (LTRTAB),HL ;Nombre de lignes table a deplacer
RET
;
;- Ici commencent les deplacements lateraux . Les testes du masque -
;- sont elimines et comme on a qu'une colonne , les DJNZ sont -
;- supprimes . Dans les transferts , des LDIR et LDDR ont ete otes -
;- pour les memes raisons -
;
;- A DROITE -
;
STOPLAT LD A,(DIRJOY) ;Remise a 0 des bits de direction lateraux
AND %00000011 ;si mouvement impossible (evite clignotement)
LD (DIRJOY),A ;en bordure d'ecran .
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
;
;- Transfert table->colons,rotation table,colonnes écran->table simultane -
;- Ensemble de routines considerablement simplifiees si on utilise le mode -
;- case par case -
;
LD HL,(LONGLTA) ;Longueur d'une ligne table
DEC HL ;Moins 1 colonne a deplacer
LD (LTRTAB),HL ; = Longueur a transferer
;
LD DE,(VISAD)
ADD HL,DE
PUSH HL
POP IY
;
LD IX,TABLE
INC IX
;
LD DE,COLONS
LD HL,TABLE
LD A,(HSP)
;
TRCSD PUSH AF LDIR a saute !
PUSH HL
LD A,(HL)
LD (DE),A
INC DE
PUSH DE
EX DE,HL
;
PUSH IX
POP HL
;
LD BC,(LTRTAB)
LDIR
;
PUSH IY ;LDIR a saute !
POP HL
LD A,(HL)
LD (DE),A
INC DE
PUSH IY
POP HL
CALL ADINF
PUSH HL
POP IY
POP DE
LD BC,(LONGLTA)
;
ADD IX,BC
POP HL
ADD HL,BC
POP AF
DEC A
JR NZ,TRCSD
RET
;
;- A gauche -
;
AGAUCH LD HL,(VISAD)
CALL TSTLAT
OR A
JR Z,STOPLAT
;
DEC HL
LD (VISAD),HL
LD HL,(COINBD)
DEC HL
LD (COINBD),HL
;
;- Transferts table . Comme le precedent dans l'autre sens -
;
LD DE,(LONGLTA) ;Comme il n'y a pas d'addition on prend
DEC DE ;directement DE
LD (LTRTAB),DE
LD HL,TABLE
ADD HL,DE
;
LD DE,COLONS
PUSH HL
LD BC,(LONGLTA)
LD A,(HSP)
;
BCLRCG PUSH AF LDIR a saute !
LD A,(HL)
LD (DE),A
INC DE
ADD HL,BC
POP AF
DEC A
JR NZ,BCLRCG
;
;- Decaler la table de 1 colonne a droite -
;
LD HL,TABLE
LD BC,(LONGLTA)
ADD HL,BC
DEC HL
EX DE,HL
POP HL
DEC HL
LD BC,(LTRTAB)
LD A,(HSP)
;
ROTDR PUSH BC
PUSH HL
PUSH DE
LDDR
POP HL
LD BC,(LONGLTA)
ADD HL,BC
EX DE,HL
POP HL
ADD HL,BC
POP BC
DEC A
JR NZ,ROTDR
;
;- Passer colonnes écran dans colonnes gauche table -
;
LD DE,TABLE
LD HL,(VISAD)
LD A,(HSP)
LD B,A
;
ECTDR PUSH BC LDIR a saute !
PUSH HL
LD A,(HL)
LD (DE),A
LD HL,(LONGLTA)
ADD HL,DE
EX DE,HL
POP HL
CALL ADINF
POP BC
DJNZ ECTDR
RET
;

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

La copie du sprite dans le buffer est réduite à sa plus simple expression !

;
;- Passer sprite dans buffer -
;
AFFISP1 LD HL,(ADSP) ;La routine buffer impair est supprimee
LD BC,(LSP) ;La case supplementaire pour cas impairs aussi .
LD DE,BUFSPT ;Les 3 routines de composition sont identiques
;
BCLBP PUSH BC
LD B,0
LDIR
POP BC
DJNZ BCLBP
;
;- Composer le rectangle a afficher -
;
COMPO LD BC,(LSP)
;........... Etc ...

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

La sortie d'affichage est modifiée .

;
;- Afficher les lignes écran stockees pour recouvrir les traces de -
;- l'ancien affichage -
;
LD A,(DIRJOY) ;Valeur renvoyee par #BB24 memorisee en NOFIRE
AND %00000011 ;Remplace les tests sur LINEMOV - COLOMOV
JR Z,TSTCOL ;Si 0 il n'y a pas eu de mouvement vertical
;
LD DE,(ADPROV)
LD HL,LINES
LD BC,(LONGLTA)
;
AFLINE LD B,4 ;Toujours 4 lignes
BCLINE PUSH DE
PUSH BC
LD B,0
LDIR
POP BC
POP DE
;
LD A,D
ADD A,8
LD D,A
JR NC,F1
PUSH HL
LD HL,#C050
ADD HL,DE
EX DE,HL
POP HL
;
F1 DJNZ BCLINE
;
;- COLONNES GAUCHE -
;
TSTCOL LD A,(DIRJOY) ;Tester mouvement lateral
AND %00001100
JR Z,EXIT ;Si 0 aucun mouvement lateral c'est fini
;
;BIT 3,A
JR NZ,CG ;a bouge a droite , restituer colonne gauche
;
LD HL,(VISAD)
LD DE,(LONGLTA)
ADD HL,DE
EX DE,HL
JR COLON1
;
;- COLONNE DROITE -
;
CG LD DE,(OLDADV) ;Pour 1 seule colonne pas besoin de LDIR
COLON1 LD HL,COLONS
LD A,(HSP)
LD B,A
BCLCOL LD A,(HL)
LD (DE),A
INC HL
;
LD A,D
ADD A,8
LD D,A
JR NC,F2
PUSH HL
LD HL,#C050
ADD HL,DE
EX DE,HL
POP HL
;
F2 DJNZ BCLCOL
;
EXIT XOR A ;Raz des 2 deplacements
LD (DIRJOY),A
JP RECU38
;

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

En passage de paramètres , juste un petit détail très important ! INC C et DEC C qui ne servent que dans les cas impairs sont supprimés .

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

;
;- Passer les parametres -
;
PARAM INC HL ;Le INC C pour cas impairs est supprime
INC HL
INC HL
LD B,(HL)
INC HL
LD C,(HL)
LD (LSP),BC
LD A,C
LD (LONGLTA),A
INC HL
LD (ADSP),HL
;
PUSH BC
PUSH BC
LD B,0
DEC C
LD HL,(VISAD)
ADD HL,BC
POP BC
DEC B
COIN CALL ADINF
DJNZ COIN
LD (COINBD),HL
POP BC
LD HL,0
LD D,0
LD E,C
BCLT ADD HL,DE
DJNZ BCLT
LD (LTABL),HL
LD DE,TABLE
ADD HL,DE
DEC HL
LD (FINTAB),HL
RET
;

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

Et voilà , il suffit de remplacer les lignes correspondantes du programme précédent et réassembler le tout pour obtenir une autre version du même programme . Si vous n'ètes pas outillé pour le faire , consolez vous , les 3 codes binaires sont présents dans la démonstration correspondante ! Le 3ème code souce ? Passez au chapitre suivant ...

SOS PROGRAMMEURS

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

Page précédente : Graphic - 09 - Creation Animations Graphiques - Animation Pixels et Case Par Case
★ 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 » Acid
» Coding Src's » Ah, Les vacances : Le Hamac
» Coding Src's » Mona Lisa (Sizin Amstrad)
» Coding Src's » Satellite TV (Amstrad Action)
» Coding Src's » Test CRTC v2.3 (MADRAM, amslive n19)
» Coding Src's » Spirograph (Computing with the Amstrad)
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 260 millisecondes et consultée 2657 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.