CODING ★ COURS DE GRAPHISME - CHAPITRE 4 : TESTS DE COLLISIONS SUR LES COULEURS ★

Graphic - 20 - un Nouveau Test de Collisions sur les Couleurs (SOS Programmeurs)
On chamboule  tout  et  on   recommence   !  Etant  donné  l'ampleur  du déménagement , nous supprimons dans  la  foulée  la routine sous interruption COMPTE et sa subordonnée CHDIR . A l'exception de ces 2 éradications qui nous permet de mettre en évidence une  autre  méthode  , le début du programme est inchangé et c'est donc à partir de  la boucle d'animation que nous présentons le listing .

Comme vous l'avez sans doute compris à  la  lecture du chapitre 4 , il va faloir modifier les 2 tests de directions verticales pour voir à chaque ligne si une couleur est  présente  .  Comme  ces  nouveaux  tests  vont prendre un certain temps d'exécution , nous devons  optimiser le programme en durée afin de ne pas avoir un déplacement plutôt poussif de nos 25 dessins .

Le nouveau principe est le  suivant  :  On  regroupe  tout dans une seule routine TSTMOVE . La direction est stockée dans le registre 16 bits IY ce qui nous autorise les instructions du type  RRC  (IY+0)  , RES bit,(IY+0) Etc ... Bien que coûteuses en cycles d'horloge  ,  au  bout  du compte on accélére le déroulement du programme en supprimant  les  PUSH/POP  AF , CALL C,adresse et autres instructions brèves mais dont le nombre alourdit l'ensemble .

Il  faut  prévoir   qu'un   sprite   peut   parfois se   trouver  dans l'impossibilité de se mouvoir car coincé entre 4 autres ou contre la bordure. Dans ce cas , l'octet direction sera  mis  à  0  . En entrée de test c'est la première chose que l'on vérifiera .
 

Algorithme général :

1 : Voir si le sprite à été bloqué .
 OUI : On saute de suite au second test (4) .
 NON : On teste si la direction prévue reste possible .

2  :   Si   la   direction   prévue   est   invalide   ,   les   routines TSTHAUT,BAS,DROIT,GAUC enlèveront successivement les bits de direction . Donc à ce point DIRJOY=0 signifie : déplacement prévu impossible .

3 : On teste si DIRJOY <> 0 après ces tests .
 OUI Tout va bien et c'est fini .
 NON On continue vers le changement de direction .

4 : Second test où l'on  regarde  si  le  sprite peut s'échapper dans une direction quelconque .

5 : On met  dans  DIRJOY  %1111  ce  qui  donne  l'ordre  de tester les 4 directions possibles .

6 : A chaque test invalide , l'un des 4 bits sera ôté .

7 : Si  DIRJOY  passe  à  0  ,  le  sprite  est  coincé  sinon le nouveau déplacement est effectué .

8 : Dans l'un ou l'autre cas on affiche et on reprend en 1 .

Voici le nouveau morceau de  listing  ou  figurent ces modifications , le  reste ne change pas .  La  démonstration  vous  permettra de constater que le carré central n'est plus détruit par la rencontre avec les sprites .
 

 ;
   ;ICI LA SECTION VARIABLE ET INITIALISATION CHAPITRE 1
 ;
;- Boucle d'animation des 25 sprites -
 ;
 RECOM   DI      ;Test direct de SPACE presse
  PUSH BC
  LD BC,#F792
  OUT (C),C
  LD BC,#F645
  OUT (C),C
  LD B,#F4
  IN A,(C)   ;SPACE ? Oui si #7F
  EI
  CP #7F
  POP BC
  JR NZ,NOQUIT
 ;
 QUIT DI
  LD A,(AD38)
  LD (#38),A
  EI
  RET
 ;
 NOQUIT  CALL INIANIM  ;Reinitialiser table et pointeurs
 ;
;- Boucle pour deplacer un sprite -
 ;
 NXTANIM CALL TRANSP ;Passer les parametres du sprite en cours
  PUSH BC    ;au programme
 ;
  CALL TSTMOVE  ;Voir si on peut le deplacer , oui si CARRY mis . Cet
;       ;etat du CARRY n'est pas utilise ici .
  CALL AFFISP ;Afficher un sprite
  CALL SPTRANS  ;et recopier les nouvelles coordonnees dans la table
  POP BC
  DJNZ NXTANIM
 ;
  JP RECOM     ;On recommence une serie de 25
 ;
;- Tester les déplacements possibles -
;

Dans ce qui suit , on  constatera  que  DIRJOY est parfois utilisé par le biais de IY et parfois par l'intermédiaire  de  A . Il s'agit juste de gagner du temps , LD A,(DIRJOY) est  plus  rapide  que  LD  A,(IY+0) . En revanche , RES0,(IY+0) est plus rapide que , PUSH  AF  - LD A,(DIRJOY) - AND %1111110 - LD (DIRJOY),A - POP AF . On préfèrera  aussi  remplacer PUSH AF et POP AF par LD A,(DIRJOY) lorsque le contenu de A  sera  modifié après un test . C'est un peu plus rapide et évite de s'occuper  des  problèmes de pile .  Dans le même esprit , BIT 0,A est bien meilleur  que  AND  %00000001 car il ne modifie pas l'accumulateur .  On  peut  savoir  tout  ceci   en  étudiant  la  durée  des instructions dans SOS5 et c'est la prise en  compte de ce genre de détail qui fait la différence entre  un  bon programmeur  et  un programmeur quelconque pensez-y .
 

 ;
 TSTMOVE LD IY,DIRJOY  ;Adresse direction dans IY .
  LD A,(DIRJOY) ;Et direction dans A .
  OR A    ;Si aucune direction active le sprite s'est coince au
  JR Z,TSTMOV1  ;tour de boucle precedent , on saute voir si on peut
;       ;maintenant le debloquer .
 ;
   BIT 0,A    ;Direction haut prevue ?
  JR Z,PASHAUT  ;Non on saute voir vers le bas .
 ;
  CALL ENHAUT ;Oui,voir si elle est valable . Ici on ne peut avoir
  JR PASBA1  ;simultanement haut et bas , on saute donc le test bas
 ;
 PASHAU1 LD A,(DIRJOY) ;Le bit direction vers le haut a ete enleve par
  OR A    ;ENHAUT , voir s'il reste encore une direction
  JR Z,TSTMOV1  ;sauter au changement de direction si non .
 ;
 PASHAUT BIT 1,A    ;Direction bas prevue ?
  JR Z,PASBAS ;Non on va voir les directions laterales
 ;
  CALL ENBAS ;Tester vers le bas
 ;
 PASBA1  LD A,(DIRJOY) ;Déplacement valide ou non , on doit
  OR A    ;recharger A avec la direction
  JR Z,TSTMOV1
 ;
 PASBAS  BIT 2,A    ;Direction gauche prevue ?
  JR Z,PASGAU ;Non on va voir a droite
 ;
  CALL AGAUCHE  ;Si le déplacement est valide c'est le dernier
  RET C   ;possible et on ignore la suite .
 ;
 PASGAU  BIT 3,A    ;Direction droite prevue ?
  JR Z,PASDROI  ;Non fin des tests .
 ;
  CALL ADROITE  ;Si le déplacement est valide c'est le dernier
  RET C   ;possible et on ignore la suite .
 ;
 PASDROI LD A,(DIRJOY) ;A ce point si la direction n'est pas 0
  OR A    ;au moins un déplacement est effectue et on
 &emspSCF     ;ne s'occupe plus du reste.
  RET NZ
 ;
;- Second test si aucun des déplacements prevu n'est possible -
 ;
 TSTMOV1 LD A,%1111 ;On active les 4 directions possibles . Chaque test
  LD (IY+0),A   invalide enlèvera un de ces bits et on verra bien
;       ;ce qui reste a la sortie .
 ;
  CALL ENHAUT ;Si la direction vers le haut est possible (CARRY mis)
  JR NC,NOHAUT
 ;
   RES 1,(IY+0)  ;On doit penser à annuler le bit de direction vers le
  JR NOBAS   ;bas pour ne pas avoir a souffrir d'une violente
;       ;contradiction !!!
 NOHAUT  CALL ENBAS
 ;
 NOBAS   CALL AGAUCHE  ;Si on ne peut aller a gauche le dernier test sera
  JP NC,ADROITE ;obligatoirement a droite et c'est fini !
   RES 3,(IY+0)  ;Si on peut aller a gauche on enleve le bit a droite
 &emspSCF     ;et c'est fini . Dans tous les cas , si le sprite est
  RET     ;coince DIRJOY contient maintenant 0 .
;

 Vient maintenant la version améliorée des 4 tests classiques , pour ENHAUT et ENBAS la présence d'une couleur  est  testée  pour  chacune des 4 lignes à déplacer . Le CARRY est mis si  le  déplacement est effectif , sinon le CARRY est ôté et le bit correspondant à la direction est mis à 0 .

 ;
;- Tests des 4 directions et déplacement si valide -
 ;
 ENHAUT  LD HL,(VISAD) ;On teste d'abord si on sort en haut de l'ecran
  LD B,4
 TSH1 LD A,H
   SUB #C0
  JR NZ,OKHAUT
  LD A,L
  CP #50
  JR C,STOPUP
 ;
 OKHAUT  CALL ADSUP ;MONTER AVANT LE TEST COULEURS ! Sinon on testerait
;        ;la ligne du sprite en cours qui est coloree et le
       ;et le déplacement serait toujours invalide !!!!
 ;
;- Test couleur vers le haut VERSION 2 -
 ;
  LD D,H    ;Copier adresse en cours dans DE pour tester
  LD E,L    ;sans modifier HL
  LD C,LSP  ;Balayer la ligne sur la largeur du sprite
 TSTUP   LD A,(DE)
  OR A   ;Si contenu écran pas 0 , la ligne est occupee
  JR NZ,STOPUP ;et on laisse tomber
  INC DE
  DEC C
  JR NZ,TSTUP
  DJNZ TSH1
 ;
;- Deplacer vers le haut -
 ;
  LD (VISAD),HL
  LD HL,(COINBD)
  CALL ADSUP
  CALL ADSUP
  CALL ADSUP
  CALL ADSUP
  LD (COINBD),HL
 ;
  LD BC,LSP1
  AND A
   SBC HL,BC
  CALL ADINF
  LD (ADPROV),HL
 &emspSCF
  RET
 ;
 STOPUP  RES 0,(IY+0) ;Déplacement impossible enlever le bit correspondant
  XOR A
  RET
 ;
;- Tester vers le bas VERSION 2 -
 ;
 ENBAS   LD B,4
  LD HL,(COINBD)
 TSB1 LD A,H
   SUB #FF
  JR NZ,OKBAS
  LD A,L
  CP #80
  JR NC,STOPBAS
 ;
 OKBAS   CALL ADINF ;AVANT LE TEST DES COULEURS !!!!
 ;
;- On teste a chaque ligne deplacee s'il y-a une couleur -
 ;
  LD D,H     ;Preserver l'adresse en cours
  LD E,L
  LD C,LSP
 TSTDO   LD A,(DE)
  OR A
  JR NZ,STOPBAS
  DEC DE
  DEC C
  JR NZ,TSTDO
  DJNZ TSB1
 ;
;- Déplacement valide effectuer mouvement -
 ;
  LD (COINBD),HL
  LD HL,(VISAD)
  LD (ADPROV),HL
  CALL ADINF
  CALL ADINF
  CALL ADINF
  CALL ADINF
  LD (VISAD),HL
 &emspSCF
  RET
 ;
 STOPBAS RES 1,(IY+0)  ;En bas impossible
  XOR A
  RET
 ;
;- Test si a droite possible -
 ;
ADROITE LD HL,(COINBD)
  CALL TSTLAT
  CP #4F
  JR Z,STOPDRO
  INC HL
 ;
;- Test couleur a droite -
 ;
  LD D,H
  LD E,L
  LD B,HSP2
 TSTDR1  LD A,(HL)
  OR A
  JR NZ,STOPDRO
  CALL ADSUP
  DJNZ TSTDR1
  EX DE,HL
 ;
;- Deplacer a droite -
 ;
  LD (COINBD),HL
  LD HL,(VISAD)
  LD (OLDADV),HL
  INC HL
  LD (VISAD),HL
 &emspSCF
  RET
 ;
 STOPDRO RES 3,(IY+0) ;A droite impossible
  XOR A
  RET
 ;
;- Test si a gauche possible -
 ;
AGAUCHE LD HL,(VISAD)
  CALL TSTLAT
  OR A
  JR Z,STOPGAU
  DEC HL
 ;
;- Test couleur a gauche -
 ;
  LD D,H
  LD E,L
  LD B,HSP2
 TSTGA1  LD A,(HL)
  OR A
  JR NZ,STOPGAU
  CALL ADINF
  DJNZ TSTGA1
  EX DE,HL
 ;
;- Deplacer a gauche -
 ;
  LD (VISAD),HL
  LD BC,LSP
  ADD HL,BC
  LD (OLDADV),HL
  LD HL,(COINBD)
  DEC HL
  LD (COINBD),HL
 &emspSCF
  RET
 ;
 STOPGAU RES 2,(IY+0) ;A gauche impossible
  XOR A
  RET
 ;
   ;ICI LES ROUTINES HABITUELLES AFFISP , ADINF , ETC ...

La détection des collisions par  le  test  des couleurs est maintenant au point . Reste à savoir quoi en faire et  comment le faire , c'est le sujet du prochain chapitre .

SOS PROGRAMMEURS

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

Page précédente : Graphic - 19 - Tests de Collisions sur les Couleurs
★ 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 » Basic - Volumes (Science et Vie Micro)
» Coding Src's » Graf (CPC Infos)
» Coding » Graphic - CPC 28 - Creation et Animation de Sprites (CPC Revue)
» Coding Src's » Einstein (Amstrad Magazine)
» Coding Src's » Cuando la pantalla tiembla (Amstrad Personal)
» Coding Src's » Jord
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 022 millisecondes et consultée 2142 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.