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