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
★ AMSTRAD CPC ★ DOWNLOAD ★ |
|
CPCrulez[Content Management System] v8.7-desktop/c Page créée en 641 millisecondes et consultée 1576 foisL'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. |
|
|