10-14 Gestion des
déplacements de la voiture
 
Qu’une touche ait été activée ou
non, la voiture continue son déplacement (sauf si elle est arrêtée).
Evidemment, si un changement de direction ou de vitesse a été demandé, il est
pris en compte.
 
On commence par analyser la
vitesse de la voiture. On se rappelle qu’il y a 6 niveaux :
 
| Vitesse | Pixels /
  50èmes | Pixels /
  sec | 
| 0 | 0 | 0 | 
| 1 | 0.25 | 12.5 | 
| 2 | 0.5 | 25 | 
| 3 | 1 | 50 | 
| 4 | 2 | 100 | 
| 5 | 3 | 150 | 
 
La vitesse 0 est bien sure la
position arrêtée. Les vitesses 1 et 2 sont un peu plus délicates à gérer. En
effet, le programme boucle tous les 50èmes de seconde, les déplacements sont
donc analysés tous ces lapses de temps. Les vitesses 1 et 2 font moins de 1
pixel de déplacement par 50èmes de seconde, il faut donc les temporiser. Donc
on prévoit un compteur qu’on décrémente à chaque boucle et quand le compteur
atteint 0 on déplace la voiture de 1 pixel en X et/ou Y. Pour la vitesse 1 il
faut 4 boucles et pour la vitesse 2 seulement 2. Ces paramètres ont été placés
dans les constantes :
 
VITEDEL1 EQU 4                  ;
Délai pour la vitesse 1 
VITEDEL2 EQU 2                  ;
Délai pour la vitesse 2 
 
Les compteurs sont ensuite réinitialisés avec ces valeurs pour assurer une continuité dans le déplacement. Une fois le délai passé, la vitesse est considérée comme la vitesse 3 pour un déplacement d’un pixel en X et/ou Y.
 
DEPL     LD A,(VITESSE)        
; A = vitesse de la voiture
         LD C,A
         OR A                  
; Vitesse nulle?
         JP Z,COURSE2           ; oui
=> on reboucle la course
 
         CP 2                  
; Analyse par rapport à vitesse 2
         JR C,DEPL1            
; Vitesse = 1 => DEPL1
         JR Z,DEPL2             ;
Vitesse = 2 => DEPL2
         JP DEPL3               ;
Vitesse = 3 => DEPL3
 
DEPL1    LD HL,DELAIV1         
; HL pointe le délai pour la vitesse 1
         LD A,(HL)              ; A =
délai
         DEC A                  ;
délai - 1
         LD (HL),A
         JP NZ,COURSE2          ; Si délai
pas passé, on reboucle
         LD A,VITEDEL1
         LD (HL),A              ;
Réinitialisation du délai
         LD C,3                 ;
Même traitement que pour vitesse 3
         JP DEPL3 
 
DEPL2    LD HL,DELAIV2         
; HL pointe le délai pour la vitesse 2
         LD A,(HL)              ; A =
délai
         DEC A                 
; délai - 1
         LD (HL),A
         JP NZ,COURSE2          ; Si délai
pas passé, on reboucle
         LD A,VITEDEL2
         LD (HL),A              ;
Réinitialisation du délai
         LD C,3                 ;
Même traitement que pour vitesse 3
         JP DEPL3
 
La vitesse est décrémentée de 2 avant
d’être placée dans BC pour le nombre de pixels de déplacement. Ensuite tout
dépend de l’angle :
 

 
| Angle | Coord. X | Coord. Y | 
| 0 | X + BC | Inchangée | 
| 1 | X + BC | Y + BC | 
| 2 | Inchangée | Y + BC | 
| 3 | X – BC | Y + BC | 
| 4 | X – BC | Inchangée | 
| 5 | X – BC | Y – BC | 
| 6 | Inchangée | Y – BC | 
| 7 | X + BC | Y – BC | 
 
Les X sont incrémentés vers la droite
et les Y vers de bas (car ils suivent les n° de segments et de ligne).
L’analyse de l’angle se fait par dichotomie. On analyse l’angle par rapport à
3, s’il est inférieur on l’analyse par rapport à 1, sinon par rapport à 5, …
 
DEPL3    DEC C                  ; Vitesse
- 2 pour déplacements en pixels
         DEC C                 
         LD B,0                 ;
BC = nombre de pixels de déplacement
         LD A,(ANGLE)          
; A = angle de la voiture
 
         CP 3                  
; Analyse par rapport à angle 3
         JR Z,DEPLANG3         
; Angle = 3 => DEPLANG3
         JR C,DEPLANG2          ; < 3
=> DEPLANG2
 
         CP 5                  
; Analyse par rapport à angle 5
         JR Z,DEPLANG5         
; Angle = 5 => DEPLANG5
         JR C,DEPLANG4         
; Angle < 5 => = 4 => DEPLANG4
 
         CP 6                   ;
Analyse par rapport à angle 6
         JR Z,DEPLANG6         
; Angle = 6 => DEPLANG6, sinon angle = 7
 
         LD HL,(XVOITURE)       ; HL = coordonnée
X de la voiture
         ADD HL,BC              ; HL
<= HL + nombre de pixels de déplacement
         LD (XVOITURE),HL       ; mémorisation de la coordonnée X
         LD HL,YVOITURE
         LD A,(HL)              ; A =
coordonnée Y de la voiture
         SUB C                 
; A <= A - nombre de lignes de déplacement
         LD (HL),A              ;
mémorisation de la coordonnée Y
         JP COURSE2             ;
Rebouclage
 
DEPLANG0 LD HL,(XVOITURE)       ; HL =
coordonnée X de la voiture
         ADD HL,BC              ; HL
<= HL + nombre de pixels de déplacement
         LD (XVOITURE),HL       ; mémorisation de la coordonnée X
         JP COURSE2             ;
Rebouclage
 
DEPLANG1 LD HL,(XVOITURE)       ; HL =
coordonnée X de la voiture
         ADD HL,BC             
; HL <= HL + nombre de pixels de
déplacement
         LD (XVOITURE),HL       ; mémorisation de la coordonnée X
         LD HL,YVOITURE
         LD A,(HL)              ; A =
coordonnée Y de la voiture
         ADD C                  ; A <= A +
nombre de lignes de déplacement
         LD (HL),A              ;
mémorisation de la coordonnée Y
         JP COURSE2             ;
Rebouclage
 
DEPLANG2 CP 1                   ;
Analyse par rapport à angle 1
         JR C,DEPLANG0          ; Angle < 1 => DEPLANG0
         JR Z,DEPLANG1          ; Angle = 1 => DEPLANG1,
sinon angle = 2
 
         LD HL,YVOITURE
         LD A,(HL)              ; A =
coordonnée Y de la voiture
         ADD C                 
; A <= A + nombre de lignes de déplacement
         LD (YVOITURE),A        ; mémorisation de la coordonnée Y
         JP COURSE2             ;
Rebouclage
 
DEPLANG3 LD HL,YVOITURE
         LD A,(HL)              ; A =
coordonnée Y de la voiture
         ADD C                 
; A <= A + nombre de lignes de déplacement
         LD (HL),A              ;
mémorisation de la coordonnée Y
         LD HL,(XVOITURE)      
; HL = coordonnée X de la voiture
         SBC HL,BC              ; HL
<= HL - nombre de pixels de déplacement
         LD (XVOITURE),HL       ; mémorisation de la coordonnée X
         JP COURSE2             ;
Rebouclage
 
DEPLANG4 LD HL,(XVOITURE)       ; HL =
coordonnée X de la voiture
         XOR A                 
; Carry = 0
         SBC HL,BC             
; HL <= HL - nombre de pixels de
déplacement
         LD (XVOITURE),HL       ; mémorisation de la coordonnée X       
         JP COURSE2             ;
Rebouclage
 
DEPLANG5 LD HL,(XVOITURE)       ; HL =
coordonnée X de la voiture
         SBC HL,BC              ; HL
<= HL - nombre de pixels de déplacement
         LD (XVOITURE),HL       ; mémorisation de la coordonnée X
         LD HL,YVOITURE
         LD A,(HL)              ; A =
coordonnée Y de la voiture
         SUB C                 
; A <= A - nombre de lignes de déplacement
         LD (HL),A              ;
mémorisation de la coordonnée Y
         JP COURSE2             ;
Rebouclage
 
DEPLANG6 LD HL,YVOITURE
         LD A,(HL)              ; A =
coordonnée Y de la voiture
         SUB C                  ; A
<= A - nombre de lignes de déplacement
         LD (HL),A              ;
mémorisation de la coordonnée Y
         JP COURSE2             ;
Rebouclage