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: 1654
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 » Cuando la pantalla tiembla (Amstrad Personal)
» Coding Src's » Entonnoir
» Coding » Graphic - 40 - Overscan (SOS Programmeurs)
» Coding Src's » A Very Moving Experience (Sean McManus and Amstrad Computer User)
» Coding Src's » Ripple (Computing with the Amstrad)
» Coding Src's » Detect CRTC type by Rhino
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 668 millisecondes et consultée 1917 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.