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: 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 » Amstrad's Folies
» Coding » Graphic - CPC 29 - Création et Animation de Sprites (CPC Revue)
» Coding Src's » Satellite TV (Amstrad Action)
» Coding Src's » Graphic - Random Symmetrical Pattern Generators
» Coding Src's » Dionysian Spiral
» Coding Src's » Graphic (Mark Holmes/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 769 millisecondes et consultée 2685 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.