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

Graphic - 19 - Tests de Collisions sur les Couleurs (SOS Programmeurs)

Commençons mollement par un test  assez  primitif ! Nous effectuons comme précédement notre test de rencontre avec  la  bordure  écran , si ce test est invalide on change de  direction  ,  s'il  est  valide  ,  on  vérifie que la nouvelle position d'affichage est vierge de  toute  couleur  . Pour ceci , on balaie dans une boucle  la  ligne  ou  colonne  que  va  occuper le sprite en fonction de sa direction .  Si  cette  position  est  vierge de toute couleur autre que celle du fond   on  effectue  le  déplacement sinon on réagit comme lors d'une sortie d'écran .

 Les modifications du listing du chapitre  3  sont tout à fait mineures et  les voici :

 

;
;- En bas -
 ;
 ENBAS   LD B,4
  LD HL,(COINBD)
 ;
 B1   LD A,H
  ;SUB #FF
  JR NZ,OKBAS
  LD A,L
  CP #80
  JR NC,STOPBAS
 ;
 OKBAS   CALL ADINF
  DJNZ B1
;-------------
 ;
;- Test de collision sur une case non vide -
 ;
  LD D,H   ;On recopie HL dans DE pour preserver cette valeur
  LD E,L   ;dont on a besoin en sortie .
 ;
  LD B,LSP    ;La largeur d'un sprite .
 ;
 TSTDO   LD A,(HL)   ;On teste toute la rangee d'adresses correspondant
  OR A     ;a la ligne du bas qui va etre occupee par le sprite
  JR NZ,STOPBAS  ;Si on y trouve une couleur quelconque
  DEC HL   ;On invalide le déplacement .
  DJNZ TSTDO
 ;
 IGNORE  LD (COINBD),DE ;Sinon on range la nouvelle coordonnee copiee dans DE
 ;
;-------------------
  LD HL,(VISAD)  ;Et pour le reste rien de neuf ...
  LD (ADPROV),HL
  LD B,4
 B2   CALL ADINF
  DJNZ B2
  LD (VISAD),HL
  ;SCF
  RET
 ;
 STOPBAS CALL CHDIR
  LD A,(HL)
  AND %11111101
  JR Z,STOPBAS
 ;
 NEWDIR  LD (DIRJOY),A
  POP IY
  POP IY
  LD HL,(OLDVISU)
  LD (VISAD),HL
  LD HL,(OLDCOIN)
  LD (COINBD),HL
  JP NXTVERT
 ;
;- Mouvement en haut -
 ;
 ENHAUT  LD HL,(VISAD)
  LD B,4
 ;
 H1   LD A,H
  ;SUB #C0
  JR NZ,OKHAUT
  LD A,L
  CP #50
  JR C,STOPUP
 ;
 OKHAUT  CALL ADSUP
  DJNZ H1
;----------------
 ;
  LD D,H     ;Test de collision sur une couleur
  LD E,L     ;Comme pour ENBAS
 ;
  LD B,LSP
 ;
 TSTUP   LD A,(HL)     ;C'est la ligne du haut qui est testee .
  OR A
  JR NZ,STOPUP
  INC HL
  DJNZ TSTUP
 ;
 IGNOR1  LD (VISAD),DE
;---------------------
  LD HL,(COINBD)
  LD B,4
 H2   CALL ADSUP
  DJNZ H2
  LD (COINBD),HL
 ;
  LD BC,LSP1
  AND A
  ;SBC HL,BC
  CALL ADINF
  LD (ADPROV),HL
  ;SCF
  RET
 ;
 STOPUP  CALL CHDIR
  LD A,(HL)
  AND %11111110
  JR Z,STOPUP
  JR NEWDIR
 ;
;- A DROITE -
 ;
ADROIT  LD HL,(COINBD)
  CALL TSTLAT
  CP #4F
  JR Z,STOPDRO
 ;
  INC HL
;------------------
  LD D,H     ;Comme precedement mais c'est une colonne
  LD E,L     ;que l'on teste
 ;
  LD B,HSP2     ;Hauteur du sprite
 TSTGAU  LD A,(HL)
  OR A
  JR NZ,STOPGAU ;Case occupee si NZ .
  CALL ADSUP
  DJNZ TSTGAU
 ;
 IGNOR2  LD (COINBD),DE
;-------------------
  LD HL,(VISAD)
  LD (OLDADV),HL
  INC HL
  LD (VISAD),HL
  ;SCF
  RET
 ;
 STOPDRO CALL CHDIR
  LD A,(HL)
  AND %11110111
  JR Z,STOPDRO
  JP NEWDIR
 ;
;- A gauche -
 ;
AGAUCH  LD HL,(VISAD)
  CALL TSTLAT
  OR A
  JR Z,STOPGAU
 ;
  DEC HL
;------------------
  LD D,H   ;Comme pour a droite mais c'est la colonne opposee
  LD E,L   ;qui est testee .
 ;
  LD B,HSP
 TSTDRO  LD A,(HL)
  OR A
  JR NZ,STOPDRO
  CALL ADINF
  DJNZ TSTDRO
 ;
 IGNOR3  LD (VISAD),DE
  EX DE,HL
    LD BC,LSP
  ADD HL,BC
  LD (OLDADV),HL
;-------------------
  LD HL,(COINBD)
  DEC HL
  LD (COINBD),HL
  ;SCF
  RET
 ;
 STOPGAU CALL CHDIR
  LD A,(HL)
  AND %11111011
  JR Z,STOPGAU
  JP NEWDIR
;

Lors du lancement de la  démonstration  qui  trace  un carré au milieu de  l'écran ,  vous  verrez  que  test  ou  pas  ,  et  bien  que  ce  carré soit incontestablement considéré comme une couleur  ,  il est effacé sans vergogne par le passage des sprites alors  que  les  sprites rebondissent bien les uns contre les autres ! Soyez observateur et constatez que par momemt les sprites
 s'encastrent plus ou moins l'un  dans  l'autre  ...  La méthode est donc très imparfaite . Pourquoi ? regardez  donc  les  2  boucles  ENHAUT et ENBAS ! On teste d'abord une à une 4 lignes écran pour  voir si on touche le bord ce qui est tout à fait correct . Mais ensuite  , le test sur les couleurs n'est fait QUE SUR  LA  NOUVELLE  LIGNE  CALCULEE  en  ignorant  joyeusement  les  3 qui précèdent ! Donc tout  obstacle  coloré  de  moins  de  5  lignes de haut est généralement ignoré et donc effacé par  l'affichage  du dessin . Le phénomème d'encastrement est dû à la même cause lors des déplacement en diagonale . Les sprites ne sont pas des carrés parfaits  et  le test peut s'effectuer sur une zone vide du dessin rencontré .

La simplicité n'est pas toujours  bonne  conseillère , passez au chapitre  suivant pour étudier un  programme  plus  complexe  mais  dont les tests sont parfaits !

SOS PROGRAMMEURS

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

Page précédente : Graphic - 16 - Animation Multi - Sprites
★ 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 » Sierpinski-Dreiecke (CPC Amstrad International)
» Coding Src's » Routines du C.C.C : 364 Couleurs
» Coding Src's » Graphic - Amstrad Character Modes (Popular Computing Weekly)
» Coding Src's » Graphik (CPC Amstrad International)
» Coding Src's » Eye
» Coding Src's » Basic - Volumes (Science et Vie Micro)
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 680 millisecondes et consultée 2050 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.