10-11 Gestion des crashes
de la voiture
Si OBSTACLE = 1, c’est que la
voiture a touché le bord de la piste. Dans ce cas le programme affiche un
sprite d’explosion à l’emplacement de la voiture. L’affichage reprend le même
algo que pour la voiture, mais sans la mémorisation de fond ni la détection de
collision. La transparence est quand même conservée, pourvu que l’on ait
restitué le fond de sprite avant. Une temporisation fait que l’explosion
apparaît 1 seconde. Ensuite on fait VIES – 1, on affiche le reste et on regarde
s’il n’est pas égal à 0. Si ce n’est pas le cas, on reboucle à l’initialisation
de la course pour que la voiture revienne sur la grille de départ.
Si la partie est perdue, on
affiche un rectangle vert entouré de blanc (la fonction BOITE ), puis on affiche
« PERDU ! » pendant 2 secondes. Le programme revient ensuite à
l’initialisation générale, suivi de l’intro.
CRASH LD A,(OBSTACLE)
; A = indicateur d'obstacle rencontré
OR A
;
Obstacle (= 1)?
JR Z,FINCOURS ; Non
=> FINCOURS
LD HL,CRASHSPR
; HL pointe les sprites de crash de voiture
LD A,(PIXEL)
; A = n° de pixel dans le segment courant
OR A
; n°
0?
JR Z,CRASH3
; non => CRASH3
LD DE,TSPRITE
; DE = taille d'un sprite en octet
CRASH2 ADD HL,DE
; HL = CRASHSPR + TSPRITE x n° pixel
DEC A
JR NZ,CRASH2
CRASH3 LD DE,(PLFOND) ; DE = pointeur sur la ligne
écran du fond
LD B,HSPRITE
; B = nombre de lignes de sprite à copier
CRASH4 PUSH DE
; mémorisation du pointeur sur la ligne écran
du fond
PUSH HL
; mémorisation du pointeur sur le sprite de
crash
EX DE,HL
LD E,(HL)
INC HL
LD D,(HL) ; DE =
adresse de la ligne de fond courante
LD HL,(SEGMENT)
; HL = segment du fond d'écran
ADD HL,DE
EX DE,HL
; DE = bord gauche de la zone écran du sprite
POP HL
; HL = pointeur sur le sprite
PUSH BC
LD B,LOSPRITE
; B = nombres d'octets à restituer en largeur
CRASH5 LD A,(HL) ; A =
octet courant du sprite
LD C,A ;
puis C
RLCA
RLCA
RLCA
RLCA ;
Inversion poids faible <-> poids fort
OR C
; A = masque des couleurs de sprite à
conserver
CPL ;
inversion pour masque des couleurs de fond à supprimer
LD C,A ; C
= masque des couleurs à supprimer
LD A,(DE) ; A =
octet de fond d'écran courant
AND C ;
suppression des couleurs génantes
LD C,(HL)
OR C ;
ajout des couleurs du sprite
LD (DE),A ;
affichage du résultat
INC DE
INC HL
DJNZ CRASH5
POP
BC
POP DE
INC DE
INC DE
; DE pointe l'adresse de la ligne écran
suivante
DJNZ CRASH4 ; Lignes
terminées? non => CRASH4
LD A,50
CALL TEMPO ; Tempo
d'une seconde (50/50èmes de seconde)
CALL RESTFOND ;
Restitution du fond de la voiture
LD A,(VIES)
DEC A
LD (VIES),A
; Vies - 1
LD HL,&C502 ; HL
pointe le nombre de vies à l'écran
CALL AFFICHE ; Affichage du nombre de vies
OR A
; Vies = 0?
JP NZ,COURSE
; non => COURSE
; Vies = 0 ou
temps = 60 minutes => PERDU! = partie terminée.
; Affichage de
"perdu!" et retour à l'initialisation de la course.
PERDU CALL
BOITE ; Dessin de la boite de dialogue
LD A,18 ;
LOCATE 18,12 pour affichage
CALL &BB6F
; du texte
LD A,12
CALL &BB72
LD HL,TEXTE3 ;
Affichage de "PERDU !"
CALL PRINTF
LD A,100
CALL TEMPO ; Tempo de 2 secondes
(100/50èmes)
JP INITVAR ;
Réinitialisation de la course