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 deplacement .
  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: 1513
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 » Amstrad's Folies
» Coding Src's » Graphic - Delirium (CPC Revue)
» Coding Src's » Trix (Amstrad Action)
» Coding Src's » Raytracing (Devilmarkus)
» Coding Src's » Ball Control (Computing with the Amstrad)
» Coding Src's » Graphic - Smoothly Scrolling
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 748 millisecondes et consultée 1595 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.