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 déplacements 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 même -
 ;
  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 même -
 ;
  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 déplacements 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  déplacements  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 déplacements
  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: 1769
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 » Origins (Computing With the Amstrad)
» Coding Src's » Dibujo Simetrico (Amstrad User)
» Coding Src's » Blitter
» Coding Src's » Fondos Sicodélicos (Amstrad Personal)
» Coding Src's » Einstein (Amstrad Magazine)
» Coding Src's » Cuando la pantalla tiembla (Amstrad Personal)
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.732-desktop/c
Page créée en 401 millisecondes et consultée 3205 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.