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: 1505
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 » Affichage écran (Rémi VILLATEL)
» Coding Src's » Screen Scroller (Popular Computing Weekly)
» Coding Src's » Graphic - Screen Rattle (Popular Computing Weekly)
» Coding Src's » Eye: Colour Swaping Demonstration
» Coding Src's » Fractal Nebulae (Computing with the Amstrad)
» Coding Src's » Yin und Yang mit BOS (CPC Magazin)
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 641 millisecondes et consultée 1576 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.