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

 

 

<< RETOUR  ---  SUITE : Analyse des fins de tour >>