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 deplacements 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) ;Deplacement 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 deplacement 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 deplacement 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 deplacement est effectue et on
SCF ;ne s'occupe plus du reste.
RET NZ
;
;- Second test si aucun des deplacements 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
SCF ;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 deplacement 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 deplacement 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
SCF
RET
;
STOPUP RES 0,(IY+0) ;Deplacement 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
;
;- Deplacement valide effectuer mouvement -
;
LD (COINBD),HL
LD HL,(VISAD)
LD (ADPROV),HL
CALL ADINF
CALL ADINF
CALL ADINF
CALL ADINF
LD (VISAD),HL
SCF
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
SCF
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
SCF
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: 1502
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 » Triangles (Amstrad Computer User)
» Coding Src's » Scrolling Scenery (Computing With the Amstrad)
» Coding Src's » Fast Dragon (Computing with the Amstrad)
» Coding Src's » Hypnotic
» Coding Src's » Rainbow-Scape (Amstrad Computer User)
» Coding Src's » 3D Donut (CPC Computing)
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 265 millisecondes et consultée 1663 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.